From 5384b5d4f8b29cb588631c85cbe08f90618aa6eb Mon Sep 17 00:00:00 2001 From: Ruslan Bannikov Date: Tue, 16 Jul 2024 18:21:25 +0500 Subject: [PATCH 1/4] =?UTF-8?q?=D0=98=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=BF=D0=BE=20=D0=BF=D1=80=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8E=20=D0=BE=D0=B3=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=87=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20=D0=BC=D1=83=D0=BB=D1=8C=D1=82=D0=B8=D1=81=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=D0=BE=D0=B2=20=D0=BF=D0=BE=20=D0=BF=D0=BE=D0=BB=D1=8E=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../3.x/forms-and-routing/efd3_editform.ru.md | 126 ++++++++++++++++++ 1 file changed, 126 insertions(+) diff --git a/pages/products/flexberry-ember/3.x/forms-and-routing/efd3_editform.ru.md b/pages/products/flexberry-ember/3.x/forms-and-routing/efd3_editform.ru.md index a8777d84f..157f7300e 100644 --- a/pages/products/flexberry-ember/3.x/forms-and-routing/efd3_editform.ru.md +++ b/pages/products/flexberry-ember/3.x/forms-and-routing/efd3_editform.ru.md @@ -602,3 +602,129 @@ export default EditFormController.extend(EditFormControllerOperationsIndicationM {% endraw %} ``` + +## Ограничение мультисписков по полю модели + +Рассмотрим применение ограничений для мультисписков на примере, в котором требуется на форме редактирования пользователя вывести других пользователей, имеющих похожие e-mail адреса. + +Реализация ограничений (фильтров) для имеющегося мультисписка в зависимости от параметров [модели](efd3_model.html), происходит в [роуте](https://guides.emberjs.com/v3.1.0/routing/defining-your-routes/) следующим образом. + +* Реализовать функцию для формирования предиката, условия по выборке данных. + +```js + objectListViewLimitPredicate(component) { + if (component.params.componentName === 'MultiUserList') { + return this.getMultiUserListPredicate(component); + } + + return null; + }, + + getMultiUserListPredicate(component) { + let email = ''; + + if (this.currentModel) { + email = this.currentModel.eMail; + } + + if (component.model) { + email = component.model.eMail; + } + + if (isEmpty(email)) { + return new FalsePredicate(); + } + + const { id } = this.paramsFor(this.get('routeName')); + + return new ComplexPredicate(Condition.And, + new SimplePredicate('eMail', FilterOperator.Eq, email), + new SimplePredicate('id', FilterOperator.Neq, id) + ); + }, +``` + +* Реализовать функцию для получения моделей данных для мультисписков. + +```js + getMultiListModels(transition, model) { + const advLimitService = this.get('advLimit'); + + return resolve(this._super(...arguments)).then(() => { + const developerUserSettings = this.get('developerUserSettings'); + const webPage = transition.targetName; + advLimitService.setCurrentAppPage(webPage); + + return advLimitService.getAdvLimitsFromStore(Object.keys(developerUserSettings)); + }).then(() => { + let userSettingsService = this.get('userSettingsService'); + let listComponentNames = userSettingsService.getListComponentNames(); + let result = {}; + listComponentNames.forEach(function(componentName) { + this.get('colsConfigMenu').updateNamedSettingTrigger(componentName); + this.get('colsConfigMenu').updateNamedAdvLimitTrigger(componentName); + let settings = this.get(`multiListSettings.${componentName}`); + + if (!isNone(settings)) { + let filtersPredicate = this._filtersPredicate(componentName); + let sorting = userSettingsService.getCurrentSorting(componentName); + let perPage = userSettingsService.getCurrentPerPage(componentName); + set(settings, 'filtersPredicate', filtersPredicate); + set(settings, 'perPage', perPage); + set(settings, 'sorting', sorting); + + let limitPredicate = + this.objectListViewLimitPredicate({ modelName: settings.modelName, projectionName: settings.projectionName, params: settings, model: model }); + + const advLimit = advLimitService.getCurrentAdvLimit(componentName); + + let queryParameters = { + componentName: componentName, + modelName: settings.modelName, + projectionName: settings.projectionName, + perPage: settings.perPage, + page: settings.page || 1, + sorting: settings.sorting, + filter: settings.filter, + filterCondition: settings.filterCondition, + filterProjectionName: settings.filterProjectionName, + filters: settings.filtersPredicate, + predicate: limitPredicate, + advLimit: advLimit, + hierarchicalAttribute: settings.inHierarchicalMode ? settings.hierarchicalAttribute : null, + hierarchyPaging: settings.hierarchyPaging + }; + + result[componentName] = this.reloadList(queryParameters); + } + }, this); + + return hash(result).then(hashModel => { + listComponentNames.forEach(function(componentName) { + let settings = this.get(`multiListSettings.${componentName}`); + if (!isNone(settings)) { + this.includeSorting(hashModel[componentName], get(settings, 'sorting')); + set(settings, 'model', hashModel[componentName]); + if (isNone(get(settings, 'sort'))) { + let sortQueryParam = serializeSortingParam(get(settings, 'sorting'), get(settings, 'sortDefaultValue')); + set(settings, 'sort', sortQueryParam); + } + } + }, this); + + return hashModel; + }); + }); + } +``` + +* Вызвать созданную функцию для получения модели в хуке [afterModel](http://emberjs.com/api/classes/Ember.Route.html#method_afterModel). + +```js + afterModel(model, transition) { + this._super(...arguments); + this.getMultiListModels(transition, model); + }, +``` + +Реализацию ограничения мультисписков по полю модели можно посмотреть на [тестовом стенде](https://flexberry.github.io/ember-flexberry/dummy/develop/#/ember-flexberry-dummy-application-user-list), перейдя на форму редактирования пользователя приложения. \ No newline at end of file From effbe8cc58f6f2964fdd49582ede79ed95ba9146 Mon Sep 17 00:00:00 2001 From: Ruslan Bannikov Date: Tue, 16 Jul 2024 23:25:32 +0500 Subject: [PATCH 2/4] =?UTF-8?q?=D0=94=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../3.x/forms-and-routing/efd3_editform.ru.md | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/pages/products/flexberry-ember/3.x/forms-and-routing/efd3_editform.ru.md b/pages/products/flexberry-ember/3.x/forms-and-routing/efd3_editform.ru.md index 157f7300e..81098e940 100644 --- a/pages/products/flexberry-ember/3.x/forms-and-routing/efd3_editform.ru.md +++ b/pages/products/flexberry-ember/3.x/forms-and-routing/efd3_editform.ru.md @@ -605,11 +605,17 @@ export default EditFormController.extend(EditFormControllerOperationsIndicationM ## Ограничение мультисписков по полю модели +Под термином "мультисписок" понимается нескольких списков на одной форме редактирования или лист-форме. + Рассмотрим применение ограничений для мультисписков на примере, в котором требуется на форме редактирования пользователя вывести других пользователей, имеющих похожие e-mail адреса. Реализация ограничений (фильтров) для имеющегося мультисписка в зависимости от параметров [модели](efd3_model.html), происходит в [роуте](https://guides.emberjs.com/v3.1.0/routing/defining-your-routes/) следующим образом. -* Реализовать функцию для формирования предиката, условия по выборке данных. +* Реализовать функцию для формирования предиката - условия по выборке данных. Т.е. для нашей задачи будут объединены в один `ComplexPredicate` два предика: + - `SimplePredicate('eMail', FilterOperator.Eq, email)` - условие на совпадение e-mail адресов. + - `SimplePredicate('id', FilterOperator.Neq, id)` - условие на несовпадение идентификаторов пользователей адресов. + +Кроме того, этот комплексный предикат будет применяться только для компоненты `MultiUserList`, которая представляет собой дополнительный список на форме редактирования пользователя. Как задавать несколько списков (дополнительные), рассказано в предыдущей главе. ```js objectListViewLimitPredicate(component) { @@ -644,7 +650,7 @@ export default EditFormController.extend(EditFormControllerOperationsIndicationM }, ``` -* Реализовать функцию для получения моделей данных для мультисписков. +* Реализовать функцию для получения моделей данных для мультисписков. Данная функция представляет собой модифицированный вариант функции `beforeModel`, реализованной в миксине [MultiListModelEditMixin](https://github.com/Flexberry/ember-flexberry/blob/develop/addon/mixins/multi-list-model-edit.js). Отличительной особенностью является передача разрезолвленной модели `model` в функцию получения предиката `objectListViewLimitPredicate`, про которую было сказано выше. В данном случае передаётся разрезолвленная модель для формирования условия по полю e-mail адреса. ```js getMultiListModels(transition, model) { @@ -657,8 +663,8 @@ export default EditFormController.extend(EditFormControllerOperationsIndicationM return advLimitService.getAdvLimitsFromStore(Object.keys(developerUserSettings)); }).then(() => { - let userSettingsService = this.get('userSettingsService'); - let listComponentNames = userSettingsService.getListComponentNames(); + const userSettingsService = this.get('userSettingsService'); + const listComponentNames = userSettingsService.getListComponentNames(); let result = {}; listComponentNames.forEach(function(componentName) { this.get('colsConfigMenu').updateNamedSettingTrigger(componentName); @@ -666,19 +672,20 @@ export default EditFormController.extend(EditFormControllerOperationsIndicationM let settings = this.get(`multiListSettings.${componentName}`); if (!isNone(settings)) { - let filtersPredicate = this._filtersPredicate(componentName); - let sorting = userSettingsService.getCurrentSorting(componentName); - let perPage = userSettingsService.getCurrentPerPage(componentName); + const filtersPredicate = this._filtersPredicate(componentName); + const sorting = userSettingsService.getCurrentSorting(componentName); + const perPage = userSettingsService.getCurrentPerPage(componentName); set(settings, 'filtersPredicate', filtersPredicate); set(settings, 'perPage', perPage); set(settings, 'sorting', sorting); - let limitPredicate = + const limitPredicate = this.objectListViewLimitPredicate({ modelName: settings.modelName, projectionName: settings.projectionName, params: settings, model: model }); const advLimit = advLimitService.getCurrentAdvLimit(componentName); - let queryParameters = { + // OLV-settings. + const queryParameters = { componentName: componentName, modelName: settings.modelName, projectionName: settings.projectionName, @@ -706,7 +713,7 @@ export default EditFormController.extend(EditFormControllerOperationsIndicationM this.includeSorting(hashModel[componentName], get(settings, 'sorting')); set(settings, 'model', hashModel[componentName]); if (isNone(get(settings, 'sort'))) { - let sortQueryParam = serializeSortingParam(get(settings, 'sorting'), get(settings, 'sortDefaultValue')); + const sortQueryParam = serializeSortingParam(get(settings, 'sorting'), get(settings, 'sortDefaultValue')); set(settings, 'sort', sortQueryParam); } } @@ -715,10 +722,10 @@ export default EditFormController.extend(EditFormControllerOperationsIndicationM return hashModel; }); }); - } + }, ``` -* Вызвать созданную функцию для получения модели в хуке [afterModel](http://emberjs.com/api/classes/Ember.Route.html#method_afterModel). +* Вызвать созданную функцию для получения модели в хуке [afterModel](http://emberjs.com/api/classes/Ember.Route.html#method_afterModel). Вызов `getMultiListModels` выполняется в хуке [afterModel](http://emberjs.com/api/classes/Ember.Route.html#method_afterModel), т.к. тут уже будет разрезолвленная основная модель формы. ```js afterModel(model, transition) { From 39bff2201ac041436421750bf23fc1c04b31f17c Mon Sep 17 00:00:00 2001 From: Ruslan Bannikov Date: Tue, 16 Jul 2024 23:53:18 +0500 Subject: [PATCH 3/4] =?UTF-8?q?=D0=9D=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C=D1=88?= =?UTF-8?q?=D0=BE=D0=B5=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flexberry-ember/3.x/forms-and-routing/efd3_editform.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/products/flexberry-ember/3.x/forms-and-routing/efd3_editform.ru.md b/pages/products/flexberry-ember/3.x/forms-and-routing/efd3_editform.ru.md index 81098e940..6e792e538 100644 --- a/pages/products/flexberry-ember/3.x/forms-and-routing/efd3_editform.ru.md +++ b/pages/products/flexberry-ember/3.x/forms-and-routing/efd3_editform.ru.md @@ -613,7 +613,7 @@ export default EditFormController.extend(EditFormControllerOperationsIndicationM * Реализовать функцию для формирования предиката - условия по выборке данных. Т.е. для нашей задачи будут объединены в один `ComplexPredicate` два предика: - `SimplePredicate('eMail', FilterOperator.Eq, email)` - условие на совпадение e-mail адресов. - - `SimplePredicate('id', FilterOperator.Neq, id)` - условие на несовпадение идентификаторов пользователей адресов. + - `SimplePredicate('id', FilterOperator.Neq, id)` - условие на несовпадение идентификаторов пользователей. Кроме того, этот комплексный предикат будет применяться только для компоненты `MultiUserList`, которая представляет собой дополнительный список на форме редактирования пользователя. Как задавать несколько списков (дополнительные), рассказано в предыдущей главе. From 690ac1cf72a2fc316a446170af35d65e65a9ac90 Mon Sep 17 00:00:00 2001 From: Svetlana Date: Wed, 28 Aug 2024 02:18:23 +0500 Subject: [PATCH 4/4] code review --- .../3.x/forms-and-routing/efd3_editform.ru.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/pages/products/flexberry-ember/3.x/forms-and-routing/efd3_editform.ru.md b/pages/products/flexberry-ember/3.x/forms-and-routing/efd3_editform.ru.md index 6e792e538..c239c7765 100644 --- a/pages/products/flexberry-ember/3.x/forms-and-routing/efd3_editform.ru.md +++ b/pages/products/flexberry-ember/3.x/forms-and-routing/efd3_editform.ru.md @@ -111,7 +111,7 @@ export default EditFormController.extend({ Для работы в режиме *только для чтения* в [базовом контроллере формы редактирования `EditFormController`](http://flexberry.github.io/ember-flexberry/autodoc/develop/classes/EditFormController.html) добавлено свойство [`readonly`](http://flexberry.github.io/ember-flexberry/autodoc/develop/classes/EditFormController.html#property_readonly). -Чтобы открыть форму редактирования только на чтение, можно: +Для отрытия формы редактирования только на чтение можно: * Передать GET-параметр в строке запроса, например, так: `http://localhost:4200/orders/10251?readonly=true`. * Переопределить определение значение свойства `readonly` в контроллере. @@ -271,7 +271,7 @@ GET http://localhost:6500/odata/NeoPlatformGenTestDetail1ForChild1s(15ca1447-3b6 Установка блокировки на редактируемый на форме объект происходит в [методе роута `beforeModel`](https://api.emberjs.com/ember/3.1/classes/Route/methods/beforeModel?anchor=beforeModel), а снятие - на [событие роута `willTransition`](https://api.emberjs.com/ember/3.1/classes/Route/events/willTransition?anchor=willTransition), если задана настройка снятия блокировок при закрытии формы. -Если пользователь пытается открыть на редактирование объект, для которой установлена блокировка, то пользователю форма будет открыта в режиме "только для чтения" или произойдёт возврат на родительский роут. Это поведение определяется настройками сервиса блокировок и может быть [переопределено](https://github.com/Flexberry/ember-flexberry/blob/develop/addon/mixins/lock-route.js) в роуте формы редактирования: +Если пользователь пытается открыть на редактирование объект, для которого установлена блокировка, то пользователю форма будет открыта в режиме "только для чтения" или произойдёт возврат на родительский роут. Это поведение определяется настройками сервиса блокировок и может быть [переопределено](https://github.com/Flexberry/ember-flexberry/blob/develop/addon/mixins/lock-route.js) в роуте формы редактирования: ```javascript import EditFormRoute from 'ember-flexberry/routes/edit-form'; @@ -611,11 +611,12 @@ export default EditFormController.extend(EditFormControllerOperationsIndicationM Реализация ограничений (фильтров) для имеющегося мультисписка в зависимости от параметров [модели](efd3_model.html), происходит в [роуте](https://guides.emberjs.com/v3.1.0/routing/defining-your-routes/) следующим образом. -* Реализовать функцию для формирования предиката - условия по выборке данных. Т.е. для нашей задачи будут объединены в один `ComplexPredicate` два предика: - - `SimplePredicate('eMail', FilterOperator.Eq, email)` - условие на совпадение e-mail адресов. - - `SimplePredicate('id', FilterOperator.Neq, id)` - условие на несовпадение идентификаторов пользователей. +* Реализовать функцию для формирования предиката - условия по выборке данных. Т.е. для нашей задачи будут объединены в один `ComplexPredicate` два предиката: -Кроме того, этот комплексный предикат будет применяться только для компоненты `MultiUserList`, которая представляет собой дополнительный список на форме редактирования пользователя. Как задавать несколько списков (дополнительные), рассказано в предыдущей главе. + * `SimplePredicate('eMail', FilterOperator.Eq, email)` - условие на совпадение e-mail адресов. + * `SimplePredicate('id', FilterOperator.Neq, id)` - условие на несовпадение идентификаторов пользователей. + +Кроме того, этот комплексный предикат будет применяться только для компонента `MultiUserList`, который представляет собой дополнительный список на форме редактирования пользователя. Как задавать несколько списков (дополнительные), рассказано в главе [Несколько списков на форме редактирования](#несколько-списков-на-форме-редактирования). ```js objectListViewLimitPredicate(component) { @@ -650,7 +651,7 @@ export default EditFormController.extend(EditFormControllerOperationsIndicationM }, ``` -* Реализовать функцию для получения моделей данных для мультисписков. Данная функция представляет собой модифицированный вариант функции `beforeModel`, реализованной в миксине [MultiListModelEditMixin](https://github.com/Flexberry/ember-flexberry/blob/develop/addon/mixins/multi-list-model-edit.js). Отличительной особенностью является передача разрезолвленной модели `model` в функцию получения предиката `objectListViewLimitPredicate`, про которую было сказано выше. В данном случае передаётся разрезолвленная модель для формирования условия по полю e-mail адреса. +* Реализовать функцию для получения моделей данных для мультисписков. Данная функция представляет собой модифицированный вариант функции `beforeModel`, реализованной в миксине [MultiListModelEditMixin](https://github.com/Flexberry/ember-flexberry/blob/develop/addon/mixins/multi-list-model-edit.js). Отличительной особенностью является передача разрезолвленной модели `model` в функцию получения предиката `objectListViewLimitPredicate`. В данном случае передаётся разрезолвленная модель для формирования условия по полю e-mail адреса. ```js getMultiListModels(transition, model) { @@ -732,6 +733,6 @@ export default EditFormController.extend(EditFormControllerOperationsIndicationM this._super(...arguments); this.getMultiListModels(transition, model); }, -``` +``` -Реализацию ограничения мультисписков по полю модели можно посмотреть на [тестовом стенде](https://flexberry.github.io/ember-flexberry/dummy/develop/#/ember-flexberry-dummy-application-user-list), перейдя на форму редактирования пользователя приложения. \ No newline at end of file +Реализацию ограничения мультисписков по полю модели можно посмотреть на [тестовом стенде](https://flexberry.github.io/ember-flexberry/dummy/develop/#/ember-flexberry-dummy-application-user-list), перейдя на форму редактирования пользователя приложения.