use of de.metas.ui.web.window.descriptor.LookupDescriptorProvider in project metasfresh-webui-api by metasfresh.
the class ViewActionParamDescriptor method createParameterFieldDescriptor.
public DocumentFieldDescriptor.Builder createParameterFieldDescriptor() {
Preconditions.checkState(isUserParameter(), "parameter is internal");
LookupDescriptorProvider lookupDescriptorProvider = LookupDescriptorProvider.NULL;
if (parameterAnnotation.widgetType().isLookup()) {
if (Check.isEmpty(parameterAnnotation.sqlLookupTableName(), true)) {
logger.warn("sqlLookupTableName not provided in " + parameterAnnotation + " (" + this + "). Continuing...");
} else {
lookupDescriptorProvider = SqlLookupDescriptor.builder().setCtxTableName(// tableName
null).setCtxColumnName(InterfaceWrapperHelper.getKeyColumnName(parameterAnnotation.sqlLookupTableName())).setDisplayType(DisplayType.Search).setReadOnlyAccess().buildProvider();
}
}
return DocumentFieldDescriptor.builder(parameterName).setCaption(parameterAnnotation.caption()).setValueClass(parameterValueClass).setWidgetType(parameterAnnotation.widgetType()).setLookupDescriptorProvider(lookupDescriptorProvider != null ? lookupDescriptorProvider : LookupDescriptorProvider.NULL).setReadonlyLogic(false).setDisplayLogic(true).setMandatoryLogic(parameterAnnotation.mandatory()).addCharacteristic(Characteristic.PublicField);
}
use of de.metas.ui.web.window.descriptor.LookupDescriptorProvider in project metasfresh-webui-api by metasfresh.
the class GridTabVOBasedDocumentEntityDescriptorFactory method createAndAddDocumentField.
private final void createAndAddDocumentField(final DocumentEntityDescriptor.Builder entityDescriptor, final GridFieldVO gridFieldVO, final boolean keyColumn) {
// From entry data-binding:
final SqlDocumentEntityDataBindingDescriptor.Builder entityBindings = entityDescriptor.getDataBindingBuilder(SqlDocumentEntityDataBindingDescriptor.Builder.class);
// From GridFieldVO:
final String fieldName = gridFieldVO.getColumnName();
final String sqlColumnName = fieldName;
//
final boolean isParentLinkColumn = sqlColumnName.equals(entityBindings.getSqlParentLinkColumnName());
//
//
DocumentFieldWidgetType widgetType;
final Class<?> valueClass;
final Optional<IExpression<?>> defaultValueExpression;
final boolean alwaysUpdateable;
final LookupDescriptorProvider lookupDescriptorProvider;
final LookupDescriptor lookupDescriptor;
ILogicExpression readonlyLogic;
if (isParentLinkColumn) {
widgetType = DocumentFieldWidgetType.Integer;
valueClass = widgetType.getValueClass();
alwaysUpdateable = false;
lookupDescriptorProvider = LookupDescriptorProvider.NULL;
lookupDescriptor = null;
defaultValueExpression = Optional.empty();
readonlyLogic = ConstantLogicExpression.TRUE;
} else {
final int displayType = gridFieldVO.getDisplayType();
widgetType = DescriptorsFactoryHelper.extractWidgetType(sqlColumnName, displayType);
alwaysUpdateable = extractAlwaysUpdateable(gridFieldVO);
final String ctxTableName = Services.get(IADTableDAO.class).retrieveTableName(gridFieldVO.getAD_Table_ID());
lookupDescriptorProvider = SqlLookupDescriptor.builder().setCtxTableName(ctxTableName).setCtxColumnName(sqlColumnName).setWidgetType(widgetType).setDisplayType(displayType).setAD_Reference_Value_ID(gridFieldVO.getAD_Reference_Value_ID()).setAD_Val_Rule_ID(gridFieldVO.getAD_Val_Rule_ID()).buildProvider();
lookupDescriptor = lookupDescriptorProvider.provideForScope(LookupDescriptorProvider.LookupScope.DocumentField);
valueClass = DescriptorsFactoryHelper.getValueClass(widgetType, lookupDescriptor);
defaultValueExpression = defaultValueExpressionsFactory.extractDefaultValueExpression(gridFieldVO.getDefaultValue(), fieldName, widgetType, valueClass, gridFieldVO.isMandatory(), gridFieldVO.isUseDocSequence());
if (keyColumn) {
readonlyLogic = ConstantLogicExpression.TRUE;
} else if (gridFieldVO.isReadOnly()) {
readonlyLogic = ConstantLogicExpression.TRUE;
} else // and we want to allow the user setting it.
if (!gridFieldVO.isUpdateable() && !gridFieldVO.isParentLink()) {
readonlyLogic = ConstantLogicExpression.FALSE;
} else {
readonlyLogic = gridFieldVO.getReadOnlyLogic();
}
}
//
// Button action
final ButtonFieldActionDescriptor buttonAction;
if (!isParentLinkColumn && widgetType.isButton()) {
buttonAction = extractButtonFieldActionDescriptor(entityDescriptor.getTableNameOrNull(), fieldName, gridFieldVO.AD_Process_ID);
if (buttonAction != null) {
final ButtonFieldActionType actionType = buttonAction.getActionType();
if (actionType == ButtonFieldActionType.processCall) {
widgetType = DocumentFieldWidgetType.ProcessButton;
} else if (actionType == ButtonFieldActionType.genericZoomInto) {
widgetType = DocumentFieldWidgetType.ZoomIntoButton;
// allow pressing the button
readonlyLogic = ConstantLogicExpression.FALSE;
}
}
} else {
buttonAction = null;
}
//
// ORDER BY SortNo
int orderBySortNo = gridFieldVO.getSortNo();
if (orderBySortNo == 0 && keyColumn) {
orderBySortNo = Integer.MAX_VALUE;
}
final String sqlColumnSql = gridFieldVO.getColumnSQL(false);
final SqlDocumentFieldDataBindingDescriptor fieldBinding = SqlDocumentFieldDataBindingDescriptor.builder().setFieldName(sqlColumnName).setTableName(entityBindings.getTableName()).setTableAlias(entityBindings.getTableAlias()).setColumnName(sqlColumnName).setColumnSql(sqlColumnSql).setVirtualColumn(gridFieldVO.isVirtualColumn()).setMandatory(gridFieldVO.isMandatoryDB()).setWidgetType(widgetType).setValueClass(valueClass).setSqlValueClass(entityBindings.getPOInfo().getColumnClass(sqlColumnName)).setLookupDescriptor(lookupDescriptor).setKeyColumn(keyColumn).setEncrypted(gridFieldVO.isEncryptedColumn()).setDefaultOrderBy(orderBySortNo).build();
final DocumentFieldDescriptor.Builder fieldBuilder = DocumentFieldDescriptor.builder(sqlColumnName).setCaption(gridFieldVO.getHeaderTrls(), gridFieldVO.getHeader()).setDescription(gridFieldVO.getDescriptionTrls(), gridFieldVO.getDescription()).setKey(keyColumn).setParentLink(isParentLinkColumn).setWidgetType(widgetType).setButtonActionDescriptor(buttonAction).setLookupDescriptorProvider(lookupDescriptorProvider).setValueClass(fieldBinding.getValueClass()).setVirtualField(fieldBinding.isVirtualColumn()).setCalculated(gridFieldVO.isCalculated()).setDefaultValueExpression(defaultValueExpression).addCharacteristicIfTrue(keyColumn, Characteristic.SideListField).addCharacteristicIfTrue(keyColumn, Characteristic.GridViewField).setReadonlyLogic(readonlyLogic).setAlwaysUpdateable(alwaysUpdateable).setMandatoryLogic(extractMandatoryLogic(gridFieldVO)).setDisplayLogic(gridFieldVO.getDisplayLogic()).setDefaultFilterInfo(createDefaultFilterDescriptor(gridFieldVO.getDefaultFilterDescriptor(), sqlColumnName, widgetType)).setDataBinding(fieldBinding);
//
// Add Field builder to document entity
entityDescriptor.addField(fieldBuilder);
//
// Add Field's data binding to entity data binding
entityBindings.addField(fieldBinding);
//
// Collect special field
collectSpecialField(fieldBuilder);
}
use of de.metas.ui.web.window.descriptor.LookupDescriptorProvider in project metasfresh-webui-api by metasfresh.
the class ADProcessDescriptorsFactory method createProcessParaDescriptor.
private DocumentFieldDescriptor.Builder createProcessParaDescriptor(final WebuiProcessClassInfo webuiProcesClassInfo, final I_AD_Process_Para adProcessParam) {
final IModelTranslationMap adProcessParaTrlsMap = InterfaceWrapperHelper.getModelTranslationMap(adProcessParam);
final String parameterName = adProcessParam.getColumnName();
//
// Ask the provider if it has some custom lookup descriptor
LookupDescriptorProvider lookupDescriptorProvider = webuiProcesClassInfo.getLookupDescriptorProviderOrNull(parameterName);
// Fallback: create an SQL lookup descriptor based on adProcessParam
if (lookupDescriptorProvider == null) {
lookupDescriptorProvider = SqlLookupDescriptor.builder().setCtxTableName(null).setCtxColumnName(parameterName).setDisplayType(adProcessParam.getAD_Reference_ID()).setAD_Reference_Value_ID(adProcessParam.getAD_Reference_Value_ID()).setAD_Val_Rule_ID(adProcessParam.getAD_Val_Rule_ID()).setReadOnlyAccess().buildProvider();
}
//
final LookupDescriptor lookupDescriptor = lookupDescriptorProvider.provideForScope(LookupDescriptorProvider.LookupScope.DocumentField);
final DocumentFieldWidgetType widgetType = extractWidgetType(parameterName, adProcessParam.getAD_Reference_ID(), lookupDescriptor, adProcessParam.isRange());
final Class<?> valueClass = DescriptorsFactoryHelper.getValueClass(widgetType, lookupDescriptor);
// process parameters shall always allow displaying the password
final boolean allowShowPassword = widgetType == DocumentFieldWidgetType.Password ? true : false;
final ILogicExpression readonlyLogic = expressionFactory.compileOrDefault(adProcessParam.getReadOnlyLogic(), ConstantLogicExpression.FALSE, ILogicExpression.class);
final ILogicExpression displayLogic = expressionFactory.compileOrDefault(adProcessParam.getDisplayLogic(), ConstantLogicExpression.TRUE, ILogicExpression.class);
final ILogicExpression mandatoryLogic = ConstantLogicExpression.of(adProcessParam.isMandatory());
final Optional<IExpression<?>> defaultValueExpr = defaultValueExpressions.extractDefaultValueExpression(adProcessParam.getDefaultValue(), parameterName, widgetType, valueClass, mandatoryLogic.isConstantTrue(), // don't allow using auto sequence
false);
final DocumentFieldDescriptor.Builder paramDescriptor = DocumentFieldDescriptor.builder(parameterName).setCaption(adProcessParaTrlsMap.getColumnTrl(I_AD_Process_Para.COLUMNNAME_Name, adProcessParam.getName())).setDescription(adProcessParaTrlsMap.getColumnTrl(I_AD_Process_Para.COLUMNNAME_Description, adProcessParam.getDescription())).setValueClass(valueClass).setWidgetType(widgetType).setAllowShowPassword(allowShowPassword).setLookupDescriptorProvider(lookupDescriptorProvider).setDefaultValueExpression(defaultValueExpr).setReadonlyLogic(readonlyLogic).setDisplayLogic(displayLogic).setMandatoryLogic(mandatoryLogic).addCharacteristic(Characteristic.PublicField);
// Add a callout to forward process parameter value (UI) to current process instance
if (webuiProcesClassInfo.isForwardValueToJavaProcessInstance(parameterName)) {
paramDescriptor.addCallout(ProcessParametersCallout::forwardValueToCurrentProcessInstance);
}
return paramDescriptor;
}
use of de.metas.ui.web.window.descriptor.LookupDescriptorProvider in project metasfresh-webui-api by metasfresh.
the class WebuiProcessClassInfo method createWebuiProcessClassInfo.
private static WebuiProcessClassInfo createWebuiProcessClassInfo(final Class<?> processClass) throws Exception {
final ProcessClassInfo processClassInfo = ProcessClassInfo.of(processClass);
final WebuiProcess webuiProcessAnn = processClass.getAnnotation(WebuiProcess.class);
@SuppressWarnings("unchecked") final Set<Method> lookupValuesProviderMethods = ReflectionUtils.getAllMethods(processClass, ReflectionUtils.withAnnotation(ProcessParamLookupValuesProvider.class));
final ImmutableMap<String, LookupDescriptorProvider> paramLookupValuesProviders = lookupValuesProviderMethods.stream().map(method -> createParamLookupValuesProvider(method)).collect(GuavaCollectors.toImmutableMap());
// Check is there were no settings at all so we could return our NULL instance
if (ProcessClassInfo.isNull(processClassInfo) && paramLookupValuesProviders.isEmpty()) {
return NULL;
}
return new WebuiProcessClassInfo(processClassInfo, webuiProcessAnn, paramLookupValuesProviders);
}
use of de.metas.ui.web.window.descriptor.LookupDescriptorProvider in project metasfresh-webui-api by metasfresh.
the class BoardDescriptorRepository method createBoardDescriptor.
private BoardDescriptor createBoardDescriptor(final int boardId) {
//
// Retrieve the board PO
final IQueryBL queryBL = Services.get(IQueryBL.class);
final I_WEBUI_Board boardPO = queryBL.createQueryBuilderOutOfTrx(I_WEBUI_Board.class).addEqualsFilter(I_WEBUI_Board.COLUMN_WEBUI_Board_ID, boardId).addOnlyActiveRecordsFilter().create().firstOnly(I_WEBUI_Board.class);
if (boardPO == null) {
throw new EntityNotFoundException("No board found for ID=" + boardId);
}
//
// Board document mappings
final String tableName = Services.get(IADTableDAO.class).retrieveTableName(boardPO.getAD_Table_ID());
final String keyColumnName = InterfaceWrapperHelper.getKeyColumnName(tableName);
// TODO: hardcoded
final String userIdColumnName = "UpdatedBy";
//
// Board document info
// TODO boardPO.getAD_Window_ID();
int adWindowId = 0;
if (adWindowId <= 0) {
adWindowId = RecordZoomWindowFinder.findAD_Window_ID(tableName);
}
final WindowId documentWindowId = WindowId.of(adWindowId);
final DocumentEntityDescriptor documentEntityDescriptor = documentDescriptors.getDocumentEntityDescriptor(documentWindowId);
final SqlDocumentEntityDataBindingDescriptor documentBinding = documentEntityDescriptor.getDataBinding(SqlDocumentEntityDataBindingDescriptor.class);
final String tableAlias = documentBinding.getTableAlias();
//
// Board document lookup provider
final int adValRuleId = boardPO.getAD_Val_Rule_ID();
final LookupDescriptorProvider documentLookupDescriptorProvider = SqlLookupDescriptor.builder().setCtxTableName(null).setCtxColumnName(keyColumnName).setDisplayType(DisplayType.Search).setWidgetType(DocumentFieldWidgetType.Lookup).setAD_Val_Rule_ID(adValRuleId).buildProvider();
//
// Board descriptor
final IModelTranslationMap boardTrlMap = InterfaceWrapperHelper.getModelTranslationMap(boardPO);
final BoardDescriptorBuilder boardDescriptor = BoardDescriptor.builder().boardId(boardPO.getWEBUI_Board_ID()).caption(boardTrlMap.getColumnTrl(I_WEBUI_Board.COLUMNNAME_Name, boardPO.getName())).documentWindowId(documentWindowId).documentLookupDescriptorProvider(documentLookupDescriptorProvider).tableName(tableName).tableAlias(tableAlias).keyColumnName(keyColumnName).userIdColumnName(userIdColumnName).websocketEndpoint(WebSocketConfig.buildBoardTopicName(boardId));
// Source document filters: AD_Val_Rule_ID
if (adValRuleId > 0) {
final IValidationRule validationRule = Services.get(IValidationRuleFactory.class).create(tableName, adValRuleId, // ctx table name
null, // ctx column name
null);
final String sqlWhereClause = validationRule.getPrefilterWhereClause().evaluate(Evaluatees.ofCtx(Env.getCtx()), OnVariableNotFound.Fail);
final DocumentFilter adValRuleFilter = DocumentFilter.builder().setFilterId("AD_Val_Rule_" + adValRuleId).addParameter(DocumentFilterParam.ofSqlWhereClause(true, sqlWhereClause)).build();
boardDescriptor.documentFilter(adValRuleFilter);
}
//
// Lanes
{
queryBL.createQueryBuilderOutOfTrx(I_WEBUI_Board_Lane.class).addEqualsFilter(I_WEBUI_Board_Lane.COLUMN_WEBUI_Board_ID, boardId).addOnlyActiveRecordsFilter().orderBy().addColumn(I_WEBUI_Board_Lane.COLUMN_SeqNo).addColumn(// just have a predictable order
I_WEBUI_Board_Lane.COLUMN_WEBUI_Board_Lane_ID).endOrderBy().create().stream(I_WEBUI_Board_Lane.class).map(this::createBoardLaneDescriptor).forEach(lane -> boardDescriptor.lane(lane.getLaneId(), lane));
}
//
// Board card fields
{
queryBL.createQueryBuilderOutOfTrx(I_WEBUI_Board_CardField.class).addEqualsFilter(I_WEBUI_Board_CardField.COLUMN_WEBUI_Board_ID, boardId).addOnlyActiveRecordsFilter().orderBy().addColumn(I_WEBUI_Board_CardField.COLUMN_SeqNo).addColumn(I_WEBUI_Board_CardField.COLUMN_WEBUI_Board_CardField_ID).endOrderBy().create().stream(I_WEBUI_Board_CardField.class).map(cardFieldPO -> createBoardCardFieldDescriptor(cardFieldPO, documentEntityDescriptor)).forEach(cardField -> boardDescriptor.cardFieldByFieldName(cardField.getFieldName(), cardField));
}
//
return boardDescriptor.build();
}
Aggregations