Решение, которое я бы использовал для этого, определенно включает поле в записи, которое содержит разделенную запятыми строку всех пользователей, которые должны иметь к ней доступ.Я работал над следующим примером, чтобы лучше объяснить, что я имею в виду.
Я создал модель, которая называется Documents и выглядит так:
На странице у меня есть таблица и кнопка для добавления новых записей документа.Страница выглядит следующим образом:
Когда я нажимаю кнопку Добавить документ , появляется диалоговое окно, которое выглядит следующим образом:
Логика для кнопки SUBMIT в приведенной выше форме следующая:
widget.datasource.item.owners = app.user.email;
widget.datasource.createItem(function(){
app.closeDialog();
});
Это автоматически назначит создателя записи право собственности.Чтобы добавить дополнительных владельцев, я делаю это в форме редактирования.Форма редактирования появляется, когда я нажимаю кнопку edit внутри строки записи.Выглядит это так:
Как видите, я использую виджет списка, чтобы контролировать, кто является владельцами.Для этого необходимо использовать настраиваемое свойство <List>String
в диалоговом окне редактирования, и это будет источник данных виджета списка.В данном случае я назвал это владельцев .Я применил следующее к событию onClick кнопки редактирования:
var owners = widget.datasource.item.owners;
owners = owners ? owners.split(",") : [];
app.pageFragments.documentEdit.properties.owners = owners;
app.showDialog(app.pageFragments.documentEdit);
Кнопка add над виджетом списка имеет следующую логику для onClick обработчик события:
widget.root.properties.owners.push("");
Виджет TextBox внутри строки виджета списка имеет следующую логику для обработчика события onValueEdit :
widget.root.properties.owners[widget.parent.childIndex] = newValue;
И кнопка CLOSE имеет следующую логику для обработчика событий onClick :
var owners = widget.root.properties.owners || [];
if(owners && owners.length){
owners = owners.filter(function(owner){
return owner != false; //jshint ignore:line
});
}
widget.datasource.item.owners = owners.join();
app.closeDialog();
Поскольку я хочу создатьлогика, которая будет загружать записи только для авторизованных пользователей, тогда мне пришлось использовать скрипт запроса в источнике данных, который будет служить этой цели.Для этого я создал эту функцию на серверном скрипте:
function getAuthorizedRecords(){
var authorized = [];
var userRoles = app.getActiveUserRoles();
var allRecs = app.models.documents.newQuery().run();
if(userRoles.indexOf(app.roles.Admins) > -1){
return allRecs;
} else {
for(var r=0; r<allRecs.length; r++){
var rec = allRecs[r];
if(rec.owners && rec.owners.indexOf(Session.getActiveUser().getEmail()) > -1){
authorized.push(rec);
}
}
return authorized;
}
}
А затем на источнике данных documents я добавил в скрипт запроса следующее:
return getAuthorizedRecords();
Это решение будет загружать все записи для пользователей с правами администратора, но для пользователей без прав администратора, оно будет загружать только записи, где их электронная почта находится у владельцев поле записи.Это самое элегантное решение, которое я мог придумать, и я надеюсь, что оно служит вашей цели.
Ссылки:
https://developers.google.com/appmaker/models/datasources#query_script
https://developers.google.com/appmaker/ui/binding#custom_properties
https://developers.google.com/appmaker/ui/logic#events
https://developers -dot-devsite-v2-prod.appspot.com / appmaker / scripting / api / client # Запись