Ulakbüs UI - API ilişkisi¶
Ulakbüs UI - API ilişkisi¶
UI hakkında¶
JSON‘dır.index.html dosyası tarayıcı tarafından işlendikten sonra uygulama başlar.app.js dosyası çalışıp gerekli modülleri ve bağımlılıkları tanımlar.ulakbus modülüdür.app_routes.js dosyasında uygulamanın sayfaları ve kullanacakları controller’lar ve template’leri düzenlenmiştir.template ve controller ile yorumlanır.UI başlangıcı¶
http://api.ulakbus.net adresinde bulunur. Geliştirme ortamı için http://nightly.api.ulakbus.net adresinde bulunur.http://localhost/?backendurl=http://nightly.api.ulakbus.net yazmanız yeterlidir./dashboard adresine yönlendirir. Uygulamanın en başında kullanıcının login durumu kontrol eder ve kullanıcı mevcut değil ise /login ekranına yönlendirilir.Login işlemi¶
http://api.ulakbus.net/login adresine kullanıcı parametreleriyle XHR istegi gönderilir.JSON nesnesinde cmd parametresini baz alarak işlemin sonucunu değerlendirilir. cmd, upgrade veya retry gelebilir.upgrade yanıtıyla birlikte ws://api.ulakbus.net/ws adresinde websocket açılır. Kullanıcı /dashboard‘a yönlendirilir. Geri kalan tüm iletişim websocket üzerinden yönetilir.retry yanıtı alınır ve kullanıcı tekrar /login sayfasına yönlendirilir. Başka aksiyon alınmaz.Dashboard¶
{view: 'dashboard'} isteği yapılır. bu isteğin yanıtında kullacının bilgisi ve de kulanıcı menüleri gelir.workflow lar bpmn formatında backend API’da oluşturulur.Api response¶
Kullanıcı kendine ait işakışlarına menüler aracılığıyla ulaşır.
Kullanıcı bir iş akışı başlattığında api ye başlattığı iş akışının model ve workflow bilgisini gönderir. Api den gelen bilgiler ile UI tarafından yorumlanır. Yorumlama işlemi CRUDListFormController tarafından yapılmaktadır.
Gelen yanıt içerisinde yer alan client_cmd parametresine göre yorumlama tipi seçilir.
client_cmd değeri show, list, form, reload veya reset olabilir.
formgönderilen datanınformsnesnesi taşıdığı ve kullanıcı arayüzünün bunu form olarak yorumlaması gerektiği durumlarda kullanılır.listsayfada listelenmesi istenen bir data olduğunda kullanılır. Bu data table olarak listelenir.showkomutu sayfada detay bilgileriyle gösterilmek istenen bır data olduğunda kullanılır.reloadkomutu sayfada gösterilen datada bir değişiklik olduğu ve datanın API’dan yeniden istenmesi gerektiği durumlarda kullanılır.resetkomutu datanın ek parametreler olmadan yeniden çekilmesi için kullanılır.
Bu komutlar oluşturulan iş akışlarının ilgili adımlarında kullanılarak arayüzün istenen şekilde davranması için gereklidir.
Diğer yanıt parametreleri forms, meta, objects, pagination, reload_cmd, token, callbackID, notify, is_login olabilir.
reload_cmdanahtarı"client_cmd": "reload"olması durumunda arayüzün backend API’dan isteyeceği komutu taşır. UI post datası içinde cmd anahtarında bu değeri gönderir.tokenanahtarında iş akış şemasının (workflow) redis’te tutulan token değeri vardır. İş akışı tamamlanmadığı sürece bu token request nesnesinde API’a gönderilir.callbackIDUI tarafından üretilip gönderilmektedir. Yanıt içerisinde bulunuyorsa UI tarafından yapılan bir isteğin yanıtı olduğu anlamına gelmektedir. Uygulama genelinde yapılan isteklerde Javascript Promise alt yapısı kullanılarak asenkron istek yapılmaktadır. Bekleyen promise resolve edilerek iş akışının devamı sağlanmaktadır.metaanahtarında arayüzde istenen yapılandırmalar yer alır. Boolean değer taşırlar. Bunlar şunlardır;allow_searchListeleme ekranında arama kutusunun gösterilmesi için kullanılır.allow_selectionListeleme ekranında tablonun solunda selectBox yer alması için kullanılır.allow_sortListeleme ekranındaki sıralama özelliği için kullanılır.allow_filterListelenen datanın filtrelemesi için kullanılır.allow_actionsListNode tipinde listelenen data için en sağdaki işlemler kolonunun gösterilmesi için kullanılır.translate_widgetKatalog verilerin düzenleneceği ekran için oluşturulan widget’dır. Aynı zamanda çeviri işlemleri için kullanılacaktır. Boolean tipinde değer alır.
_debug_queriesanahtarı geliştiriciler için yardımcı bir anahtardır. Veritabanına yapılan sorguların süresi ve kaç adet sorgu yapıldığı gibi değerler bu anahtarda yer alır. Aktif olması için API ortamında çevre değişkeniDEBUG=1olarak atanmalıdır.is_loginanahtarı kullanıcının giriş yapıp yapmadığını gösteren bir anahtardır. Bu anahtarfalsedeğer taşıdığında arayüz login sayfasına yönlendirir.notifyayayüzde bildirim göstermek için kullanılır. Gönderilen bildirimler pencerenin sağ üstünde yer alır ve bir süre sonra kaybolur.paginationanahtarı listeleme gösterimlarinde sayfalama bilgisini bulundurur.
Ulakbüs UI Öğeleri¶
- Form öğesi - Ekleme ve düzenleme işlemleri
- Liste öğesi - Listeleme, arama, filtre ve silme işlemleri
- Detay öğesi - Tek nesne detay ve rapor ekranları
| İçerik türü | Anahtar |
|---|---|
| Form | forms |
| Liste | objects |
| Detay | object |
- detay
- form
- liste
Form Öğesi¶
Örnek bir forms nesnesi aşağıdaki gibidir:
{
"forms":{
"constraints":{},
"model":{ "ad":null, "soyad":null },
"grouping":{},
"form":[
{ "helpvalue":null, "type":"help" },
"ad",
"soyad",
{
"titleMap":[
{ "name":"Bay", "value":1 },
{ "name":"Bayan", "value":2 }
],
"type":"select",
"key":"cinsiyet",
"title":"Cinsiyet"
},
"e_posta",
"dogum_tarihi",
"save_edit",
"nufus_kayitlari_id",
],
"schema":{
"required":[ "ad", "soyad" ],
"type":"object",
"properties":{
"ad":{ "type":"string", "title":"Adı" },
"soyad":{ "type":"string", "title":"Soyadı" },
"e_posta":{ "type":"string", "title":"E-Posta" },
"save_edit":{ "cmd":"save::add_edit_form", "type":"button", "title":"Kaydet" },
"nufus_kayitlari_id":{
"list_cmd":"select_list",
"title":"Nüfus Bilgileri",
"wf":"crud",
"add_cmd":"add_edit_form",
"type":"model",
"model_name":"NufusKayitlari"
},
"dogum_tarihi":{ "type":"date", "title":"Doğum Tarihi" },
"cinsiyet":{ "type":"select", "title":"Cinsiyet" }
},
"title":"Personel"
}
}
}
forms’un öğeler ise şunlardır:
form
Bu anahtar altında formda gösterilmesi istenen inputlar bir liste halinde yer alır.
schema
schema anahtarının alt özellikleri vardır. Bunlardan required bir liste halinde doldurulması gerekli alanları gösterir.properties anahtarında form anahtarında belirtilen alanların özelliklerinin yer aldığı anahtardır.{
"e_posta":{ "type":"string", "title":"E-Posta" }
}
type alanında inputun tipi ve title alanında bu inputun başlığı yer alır.İlişkisel veri tipleri olan ListNode, Node ve Model için bu anahtarlarda
wf,add_cmd,list_cmd,model_namedeğerleri bulunmaktadır. Bu değerler form sayfası oluşturulurken dikkate alınır.Formlarda birden fazla buton değişik işleri yapabilsin diye bu input alanlarına
cmddeğeri eklenmiştir. Bu değer form submit edilirkencmdanahtarında API’a gönderilir.Ek işlevsellik isteyen alanlar için (Node, ListNode, Model, select, file, submit, date, text_general, etc.) template’ler oluşturulmuştur.
Field tipleri şunlar olabilir:
buttonsubmitfileselectdateintbooleanstringtypeaheadtext_generalfloatmodelNodeListNode
model
grouping
layout değeri 12 birimlik alanda kaç birim olarak yer alacağını gösterir.{
"grouping": [
{
"group_title": "Gorev",
"items": ["gorev_tipi", "birim", "aciklama"],
"layout": "4",
"collapse": false
}
]
}
constraints
Form inputlarının birbirlerine göre bağımlılıklarının denetlendiği ve düzenlendiği anahtardır. Geliştirme aşamasındadır.
Liste öğesi¶
Liste öğesinde kaydedilen nesneler listelenir.
Listelenecek öğeler
objectsanahtarında döner. Dönen listede ilk nesne listenin başlık değerlerini oluşturur.İkinci nesneden itibaren
fieldsanahtarında liste halinde aynı sırayla ilk nesnedeki başlıkların karşılığı değerler yer almaktadır.actionsanahtarında o satır için gerçekleştirilebilecek işlemler yer almaktadır. İşlemlerin gösterim şekillerishow_asanahtarında gönderilir.İşlemler varsayılan olarak satırın sonundaki işlemler alanında gösterilir.
Eğer satırdaki bir hücreye uygulanması isteniyorsa hangi alana uygulanacağı bir liste içinde işlem nesnesinin
fieldsanahtarında belitrilir.Gerçekleştirilecek işlemin ne olacağı işlemin
cmdanahtarında yer alır.modeanahtarı normal (varsayılan), new (yeni sayfada) ve modal (bir modal içinde) değerlerini alabilir.paginationanahtarında sayfalama uygulandıysa sayfa başına kaç nesne olduğuper_page, toplam nesne sayısıtotal_objects, toplam sayfa sayısıtotal_pages, ve o an hangi sayfada olunduğupagebilgisi yer alır.Liste sayfasıyla birlikte gönderilen
"forms"anahtarında o sayfada ayrıca form işlemlerinin yapılması sağlanmaktadır. Aşağıdaki örnekte o anki modele yeni bir kayıt eklemek için forms anahtarının kullanıldığı görülmektedir.
{
"forms":{
"constraints":{},
"model":{ "add": null },
"grouping":{},
"form":[ "add" ],
"schema":{
"required":[ "add" ],
"type":"object",
"properties":{
"add":{
"cmd":"add_edit_form",
"type":"button",
"title":"Ekle"
}
},
"title":"Personeller"
}
},
"pagination":{
"per_page":8,
"total_objects":26,
"total_pages":3,
"page":1
},
"objects":[
[ "Adı", "Soyadı", "TC No", "Durum" ],
{
"fields":[
"Işık",
"Ülker",
"19189958696",
null
],
"actions":[
{
"fields":[
0
],
"cmd":"show",
"mode":"normal",
"show_as":"link"
},
{
"cmd":"add_edit_form",
"name":"Düzenle",
"show_as":"button",
"mode":"normal"
},
{
"cmd":"delete",
"name":"Sil",
"show_as":"button",
"mode":"normal"
}
],
"key":"1234qwer"
}
]
}
Detay öğesi¶
Detay öğesinde gösterilmek istenen nesne anahtar değer olarak sıralanır. Örnekte bir kişi kaydının anahtar değerleri görülmektedir.
{
"object":{
"Cep Telefonu":"+90 (259) 6925396",
"Cinsiyet":"Erkek",
"Soyadı":"Arsoy",
"TC No":"63488661696",
"Adı":"Kutun",
"Doğum Tarihi":"03.04.1969",
"E-Posta":"daslan@arsoy.com"
}
}
Logout İşlemi¶
{wf: "logout"} bilgisi API’a gönderilir. Gelen yanıt ardından websoket kapatılır, oturum sonlanır.