Search in sources :

Example 1 with DatePanel

use of com.evolveum.midpoint.web.component.input.DatePanel in project midpoint by Evolveum.

the class ACAttributeValuePanel method createTypedInputComponent.

private InputPanel createTypedInputComponent(String id, PrismPropertyDefinition definition) {
    QName valueType = definition.getTypeName();
    final String baseExpression = ACValueConstructionDto.F_VALUE;
    InputPanel panel;
    if (DOMUtil.XSD_DATETIME.equals(valueType)) {
        panel = new DatePanel(id, new PropertyModel<>(getModel(), baseExpression));
    } else if (ProtectedStringType.COMPLEX_TYPE.equals(valueType)) {
        panel = new PasswordPanel(id, new PropertyModel<>(getModel(), baseExpression));
    } else if (DOMUtil.XSD_BOOLEAN.equals(valueType)) {
        panel = new TriStateComboPanel(id, new PropertyModel<>(getModel(), baseExpression));
    } else if (SchemaConstants.T_POLY_STRING_TYPE.equals(valueType)) {
        panel = new TextPanel<>(id, new PropertyModel<>(getModel(), baseExpression + ".orig"), String.class);
    } else {
        Class type = XsdTypeMapper.getXsdToJavaMapping(valueType);
        if (type != null && type.isPrimitive()) {
            type = ClassUtils.primitiveToWrapper(type);
        }
        panel = new TextPanel<>(id, new PropertyModel<>(getModel(), baseExpression), type);
        if (ObjectType.F_NAME.equals(definition.getItemName())) {
            panel.getBaseFormComponent().setRequired(true);
        }
    }
    return panel;
}
Also used : TriStateComboPanel(com.evolveum.midpoint.web.component.input.TriStateComboPanel) PasswordPanel(com.evolveum.midpoint.gui.api.component.password.PasswordPanel) QName(javax.xml.namespace.QName) InputPanel(com.evolveum.midpoint.web.component.prism.InputPanel) DatePanel(com.evolveum.midpoint.web.component.input.DatePanel) PropertyModel(org.apache.wicket.model.PropertyModel) TextPanel(com.evolveum.midpoint.web.component.input.TextPanel)

Example 2 with DatePanel

use of com.evolveum.midpoint.web.component.input.DatePanel in project midpoint by Evolveum.

the class InternalsClockPanel method onInitialize.

@Override
protected void onInitialize() {
    super.onInitialize();
    setOutputMarkupId(true);
    Form form = new MidpointForm<>(ID_FORM);
    form.setOutputMarkupId(true);
    add(form);
    DatePanel offset = new DatePanel(ID_OFFSET, getModel());
    form.add(offset);
    AjaxSubmitButton saveButton = new AjaxSubmitButton(ID_BUTTON_SAVE, createStringResource("PageInternals.button.changeTime")) {

        private static final long serialVersionUID = 1L;

        @Override
        protected void onSubmit(AjaxRequestTarget target) {
            savePerformed(target);
        }

        @Override
        protected void onError(AjaxRequestTarget target) {
            target.add(getPageBase().getFeedbackPanel());
        }
    };
    form.add(saveButton);
    AjaxSubmitButton resetButton = new AjaxSubmitButton(ID_BUTTON_RESET, createStringResource("PageInternals.button.resetTimeChange")) {

        private static final long serialVersionUID = 1L;

        @Override
        protected void onSubmit(AjaxRequestTarget target) {
            resetPerformed(target);
        }

        @Override
        protected void onError(AjaxRequestTarget target) {
            target.add(getPageBase().getFeedbackPanel());
        }
    };
    form.add(resetButton);
}
Also used : AjaxRequestTarget(org.apache.wicket.ajax.AjaxRequestTarget) AjaxSubmitButton(com.evolveum.midpoint.web.component.AjaxSubmitButton) Form(org.apache.wicket.markup.html.form.Form) MidpointForm(com.evolveum.midpoint.web.component.form.MidpointForm) DatePanel(com.evolveum.midpoint.web.component.input.DatePanel) MidpointForm(com.evolveum.midpoint.web.component.form.MidpointForm)

Example 3 with DatePanel

use of com.evolveum.midpoint.web.component.input.DatePanel in project midpoint by Evolveum.

the class AuditLogViewerPanel method initParametersPanel.

private void initParametersPanel(Form mainForm) {
    WebMarkupContainer parametersPanel = new WebMarkupContainer(ID_PARAMETERS_PANEL);
    parametersPanel.setOutputMarkupId(true);
    mainForm.add(parametersPanel);
    PropertyModel<XMLGregorianCalendar> fromModel = new PropertyModel<XMLGregorianCalendar>(auditSearchDto, AuditSearchDto.F_FROM);
    DatePanel from = new DatePanel(ID_FROM, fromModel);
    DateValidator dateFromValidator = WebComponentUtil.getRangeValidator(mainForm, new ItemPath(AuditSearchDto.F_FROM));
    dateFromValidator.setMessageKey("AuditLogViewerPanel.dateValidatorMessage");
    dateFromValidator.setDateFrom((DateTimeField) from.getBaseFormComponent());
    for (FormComponent<?> formComponent : from.getFormComponents()) {
        formComponent.add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
    }
    from.setOutputMarkupId(true);
    parametersPanel.add(from);
    PropertyModel<XMLGregorianCalendar> toModel = new PropertyModel<XMLGregorianCalendar>(auditSearchDto, AuditSearchDto.F_TO);
    DatePanel to = new DatePanel(ID_TO, toModel);
    DateValidator dateToValidator = WebComponentUtil.getRangeValidator(mainForm, new ItemPath(AuditSearchDto.F_FROM));
    dateToValidator.setMessageKey("AuditLogViewerPanel.dateValidatorMessage");
    dateToValidator.setDateTo((DateTimeField) to.getBaseFormComponent());
    for (FormComponent<?> formComponent : to.getFormComponents()) {
        formComponent.add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
    }
    to.setOutputMarkupId(true);
    parametersPanel.add(to);
    PropertyModel<ItemPathDto> changedItemModel = new PropertyModel<ItemPathDto>(auditSearchDto, AuditSearchDto.F_CHANGED_ITEM);
    ItemPathPanel changedItemPanel = new ItemPathPanel(ID_CHANGED_ITEM, changedItemModel, pageBase);
    //        changedItemPanel.getBaseFormComponent().add(new EmptyOnChangeAjaxFormUpdatingBehavior());
    //        changedItemPanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
    changedItemPanel.setOutputMarkupId(true);
    parametersPanel.add(changedItemPanel);
    PropertyModel<String> hostIdentifierModel = new PropertyModel<>(auditSearchDto, AuditSearchDto.F_HOST_IDENTIFIER);
    TextPanel<String> hostIdentifier = new TextPanel<>(ID_HOST_IDENTIFIER, hostIdentifierModel);
    hostIdentifier.getBaseFormComponent().add(new EmptyOnChangeAjaxFormUpdatingBehavior());
    hostIdentifier.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
    hostIdentifier.setOutputMarkupId(true);
    parametersPanel.add(hostIdentifier);
    ListModel<AuditEventTypeType> eventTypeListModel = new ListModel<AuditEventTypeType>(Arrays.asList(AuditEventTypeType.values()));
    PropertyModel<AuditEventTypeType> eventTypeModel = new PropertyModel<AuditEventTypeType>(auditSearchDto, AuditSearchDto.F_EVENT_TYPE);
    DropDownChoicePanel<AuditEventTypeType> eventType = new DropDownChoicePanel<AuditEventTypeType>(ID_EVENT_TYPE, eventTypeModel, eventTypeListModel, new EnumChoiceRenderer<AuditEventTypeType>(), true);
    eventType.getBaseFormComponent().add(new EmptyOnChangeAjaxFormUpdatingBehavior());
    eventType.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
    eventType.setOutputMarkupId(true);
    parametersPanel.add(eventType);
    WebMarkupContainer eventStage = new WebMarkupContainer(ID_EVENT_STAGE);
    eventStage.add(visibilityByKey(visibilityMap, EVENT_STAGE_LABEL_VISIBILITY));
    eventStage.setOutputMarkupId(true);
    parametersPanel.add(eventStage);
    ListModel<AuditEventStageType> eventStageListModel = new ListModel<AuditEventStageType>(Arrays.asList(AuditEventStageType.values()));
    PropertyModel<AuditEventStageType> eventStageModel = new PropertyModel<AuditEventStageType>(auditSearchDto, AuditSearchDto.F_EVENT_STAGE);
    DropDownChoicePanel<AuditEventStageType> eventStageField = new DropDownChoicePanel<AuditEventStageType>(ID_EVENT_STAGE_FIELD, eventStageModel, eventStageListModel, new EnumChoiceRenderer<AuditEventStageType>(), true);
    eventStageField.add(visibilityByKey(visibilityMap, EVENT_STAGE_FIELD_VISIBILITY));
    eventStageField.getBaseFormComponent().add(new EmptyOnChangeAjaxFormUpdatingBehavior());
    eventStageField.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
    eventStageField.setOutputMarkupId(true);
    eventStage.add(eventStageField);
    ListModel<OperationResultStatusType> outcomeListModel = new ListModel<OperationResultStatusType>(Arrays.asList(OperationResultStatusType.values()));
    PropertyModel<OperationResultStatusType> outcomeModel = new PropertyModel<OperationResultStatusType>(auditSearchDto, AuditSearchDto.F_OUTCOME);
    DropDownChoicePanel<OperationResultStatusType> outcome = new DropDownChoicePanel<OperationResultStatusType>(ID_OUTCOME, outcomeModel, outcomeListModel, new EnumChoiceRenderer<OperationResultStatusType>(), true);
    outcome.getBaseFormComponent().add(new EmptyOnChangeAjaxFormUpdatingBehavior());
    outcome.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
    outcome.setOutputMarkupId(true);
    parametersPanel.add(outcome);
    List<String> channelList = WebComponentUtil.getChannelList();
    List<QName> channelQnameList = new ArrayList<QName>();
    for (int i = 0; i < channelList.size(); i++) {
        String channel = channelList.get(i);
        if (channel != null) {
            QName channelQName = QNameUtil.uriToQName(channel);
            channelQnameList.add(channelQName);
        }
    }
    ListModel<QName> channelListModel = new ListModel<QName>(channelQnameList);
    PropertyModel<QName> channelModel = new PropertyModel<QName>(auditSearchDto, AuditSearchDto.F_CHANNEL);
    DropDownChoicePanel<QName> channel = new DropDownChoicePanel<QName>(ID_CHANNEL, channelModel, channelListModel, new QNameChoiceRenderer(), true);
    channel.getBaseFormComponent().add(new EmptyOnChangeAjaxFormUpdatingBehavior());
    channel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
    channel.setOutputMarkupId(true);
    parametersPanel.add(channel);
    List<Class<? extends ObjectType>> allowedClasses = new ArrayList<>();
    allowedClasses.add(UserType.class);
    MultiValueChoosePanel<ObjectType> chooseInitiatorPanel = new SingleValueChoosePanel<ObjectReferenceType, ObjectType>(ID_INITIATOR_NAME, allowedClasses, objectReferenceTransformer, new PropertyModel<ObjectReferenceType>(auditSearchDto, AuditSearchDto.F_INITIATOR_NAME));
    parametersPanel.add(chooseInitiatorPanel);
    WebMarkupContainer targetOwnerName = new WebMarkupContainer(ID_TARGET_OWNER_NAME);
    targetOwnerName.add(visibilityByKey(visibilityMap, TARGET_OWNER_LABEL_VISIBILITY));
    parametersPanel.add(targetOwnerName);
    MultiValueChoosePanel<ObjectType> chooseTargerOwnerPanel = new SingleValueChoosePanel<ObjectReferenceType, ObjectType>(ID_TARGET_OWNER_NAME_FIELD, allowedClasses, objectReferenceTransformer, new PropertyModel<ObjectReferenceType>(auditSearchDto, AuditSearchDto.F_TARGET_OWNER_NAME));
    chooseTargerOwnerPanel.add(visibilityByKey(visibilityMap, TARGET_OWNER_FIELD_VISIBILITY));
    targetOwnerName.add(chooseTargerOwnerPanel);
    WebMarkupContainer targetName = new WebMarkupContainer(ID_TARGET_NAME);
    targetName.add(visibilityByKey(visibilityMap, TARGET_NAME_LABEL_VISIBILITY));
    parametersPanel.add(targetName);
    List<Class<? extends ObjectType>> allowedClassesAll = new ArrayList<>();
    allowedClassesAll.addAll(ObjectTypes.getAllObjectTypes());
    MultiValueChoosePanel<ObjectType> chooseTargetPanel = new MultiValueChoosePanel<ObjectType>(ID_TARGET_NAME_FIELD, new PropertyModel<List<ObjectType>>(auditSearchDto, AuditSearchDto.F_TARGET_NAMES_OBJECTS), allowedClassesAll);
    chooseTargetPanel.setOutputMarkupId(true);
    chooseTargetPanel.add(visibilityByKey(visibilityMap, TARGET_NAME_FIELD_VISIBILITY));
    targetName.add(chooseTargetPanel);
    AjaxSubmitButton ajaxButton = new AjaxSubmitButton(ID_SEARCH_BUTTON, createStringResource("BasicSearchPanel.search")) {

        private static final long serialVersionUID = 1L;

        @Override
        protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
            auditLogStorage.setSearchDto(searchDto);
            auditLogStorage.setPageNumber(0);
            Form mainForm = (Form) getParent().getParent();
            addOrReplaceTable(mainForm);
            getFeedbackPanel().getFeedbackMessages().clear();
            target.add(getFeedbackPanel());
            target.add(mainForm);
        }

        @Override
        protected void onError(AjaxRequestTarget target, Form<?> form) {
            target.add(getFeedbackPanel());
        }
    };
    WebMarkupContainer valueRefTargetNameContainer = new WebMarkupContainer(ID_VALUE_REF_TARGET_NAMES);
    valueRefTargetNameContainer.add(visibilityByKey(visibilityMap, TARGET_NAME_LABEL_VISIBILITY));
    parametersPanel.add(valueRefTargetNameContainer);
    MultiValueChoosePanel<ObjectType> chooseValueRefTargetNamePanel = new MultiValueChoosePanel<ObjectType>(ID_VALUE_REF_TARGET_NAMES_FIELD, new PropertyModel<List<ObjectType>>(auditSearchDto, AuditSearchDto.F_VALUE_REF_TARGET_NAME), allowedClassesAll);
    chooseValueRefTargetNamePanel.setOutputMarkupId(true);
    chooseValueRefTargetNamePanel.add(visibilityByKey(visibilityMap, VALUE_REF_TARGET_NAME_FIELD_VISIBILITY));
    valueRefTargetNameContainer.add(chooseValueRefTargetNamePanel);
    ajaxButton.setOutputMarkupId(true);
    parametersPanel.add(ajaxButton);
}
Also used : ArrayList(java.util.ArrayList) TextPanel(com.evolveum.midpoint.web.component.input.TextPanel) EmptyOnChangeAjaxFormUpdatingBehavior(com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnChangeAjaxFormUpdatingBehavior) DatePanel(com.evolveum.midpoint.web.component.input.DatePanel) List(java.util.List) ArrayList(java.util.ArrayList) Collectors.toList(java.util.stream.Collectors.toList) ItemPathPanel(com.evolveum.midpoint.gui.api.component.path.ItemPathPanel) MultiValueChoosePanel(com.evolveum.midpoint.web.component.form.multivalue.MultiValueChoosePanel) DateValidator(com.evolveum.midpoint.web.util.DateValidator) OperationResultStatusType(com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultStatusType) ItemPathDto(com.evolveum.midpoint.gui.api.component.path.ItemPathDto) AjaxRequestTarget(org.apache.wicket.ajax.AjaxRequestTarget) XMLGregorianCalendar(javax.xml.datatype.XMLGregorianCalendar) ObjectReferenceType(com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType) AuditEventStageType(com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventStageType) DropDownChoicePanel(com.evolveum.midpoint.web.component.input.DropDownChoicePanel) Form(org.apache.wicket.markup.html.form.Form) EmptyOnBlurAjaxFormUpdatingBehaviour(com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour) WebMarkupContainer(org.apache.wicket.markup.html.WebMarkupContainer) ObjectType(com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType) QNameChoiceRenderer(com.evolveum.midpoint.web.component.input.QNameChoiceRenderer) AjaxSubmitButton(com.evolveum.midpoint.web.component.AjaxSubmitButton) QName(javax.xml.namespace.QName) PropertyModel(org.apache.wicket.model.PropertyModel) ListModel(org.apache.wicket.model.util.ListModel) AuditEventTypeType(com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventTypeType) CanonicalItemPath(com.evolveum.midpoint.prism.path.CanonicalItemPath) ItemPath(com.evolveum.midpoint.prism.path.ItemPath)

Example 4 with DatePanel

use of com.evolveum.midpoint.web.component.input.DatePanel in project midpoint by Evolveum.

the class RunReportPopupPanel method createTypedInputPanel.

private InputPanel createTypedInputPanel(String componentId, IModel<JasperReportValueDto> model, String expression, JasperReportParameterDto param) {
    InputPanel panel;
    Class<?> type;
    try {
        if (param.isMultiValue()) {
            type = param.getNestedType();
        } else {
            type = param.getType();
        }
    } catch (ClassNotFoundException e) {
        getSession().error("Could not find parameter type definition. Check the configuration.");
        throw new RestartResponseException(getPageBase());
    }
    if (type.isEnum()) {
        panel = WebComponentUtil.createEnumPanel(type, componentId, new PropertyModel<>(model, expression), this);
    } else if (XMLGregorianCalendar.class.isAssignableFrom(type)) {
        panel = new DatePanel(componentId, new PropertyModel<>(model, expression));
    } else if (param.getProperties() != null && param.getProperties().getTargetType() != null) {
        // render autocomplete box
        LookupTableType lookup = new LookupTableType();
        panel = new AutoCompleteTextPanel<String>(componentId, new LookupPropertyModel<>(model, expression, lookup, false), String.class) {

            @Override
            public Iterator<String> getIterator(String input) {
                return prepareAutoCompleteList(input, lookup, param).iterator();
            }
        };
    } else {
        panel = new TextPanel<>(componentId, new PropertyModel<>(model, expression), type);
    }
    List<FormComponent> components = panel.getFormComponents();
    for (FormComponent component : components) {
        component.add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
    }
    panel.setOutputMarkupId(true);
    return panel;
}
Also used : FormComponent(org.apache.wicket.markup.html.form.FormComponent) InputPanel(com.evolveum.midpoint.web.component.prism.InputPanel) LookupPropertyModel(com.evolveum.midpoint.web.model.LookupPropertyModel) PropertyModel(org.apache.wicket.model.PropertyModel) EmptyOnBlurAjaxFormUpdatingBehaviour(com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour) PolyString(com.evolveum.midpoint.prism.polystring.PolyString) XMLGregorianCalendar(javax.xml.datatype.XMLGregorianCalendar) RestartResponseException(org.apache.wicket.RestartResponseException) DatePanel(com.evolveum.midpoint.web.component.input.DatePanel) Iterator(java.util.Iterator) LookupPropertyModel(com.evolveum.midpoint.web.model.LookupPropertyModel) LookupTableType(com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType)

Example 5 with DatePanel

use of com.evolveum.midpoint.web.component.input.DatePanel in project midpoint by Evolveum.

the class DateIntervalSearchPopupPanel method customizationPopoverForm.

@Override
protected void customizationPopoverForm(MidpointForm popoverForm) {
    DateValidator validator = WebComponentUtil.getRangeValidator(popoverForm, SchemaConstants.PATH_ACTIVATION);
    WebMarkupContainer fromLabel = new WebMarkupContainer(ID_DATE_FROM_LABEL);
    fromLabel.add(new VisibleBehaviour(() -> isInterval()));
    popoverForm.add(fromLabel);
    WebMarkupContainer fromValueContainer = new WebMarkupContainer(ID_DATE_FROM_VALUE_CONTAINER);
    fromValueContainer.add(AttributeAppender.append("class", () -> {
        if (isInterval()) {
            return "col-sm-10";
        }
        return "col-sm-12";
    }));
    popoverForm.add(fromValueContainer);
    DatePanel fromDatePanel = new DatePanel(ID_DATE_FROM_VALUE, fromDateModel);
    fromDatePanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
    fromValueContainer.add(fromDatePanel);
    validator.setDateFrom((DateTimeField) fromDatePanel.getBaseFormComponent());
    WebMarkupContainer toContainer = new WebMarkupContainer(ID_DATE_TO_CONTAINER);
    toContainer.add(new VisibleBehaviour(() -> isInterval()));
    popoverForm.add(toContainer);
    DatePanel toDatePanel = new DatePanel(ID_DATE_TO_VALUE, toDateModel);
    toDatePanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
    toContainer.add(toDatePanel);
    validator.setDateFrom((DateTimeField) toDatePanel.getBaseFormComponent());
}
Also used : DateValidator(com.evolveum.midpoint.web.util.DateValidator) VisibleBehaviour(com.evolveum.midpoint.web.component.util.VisibleBehaviour) DatePanel(com.evolveum.midpoint.web.component.input.DatePanel) EmptyOnBlurAjaxFormUpdatingBehaviour(com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour) WebMarkupContainer(org.apache.wicket.markup.html.WebMarkupContainer)

Aggregations

DatePanel (com.evolveum.midpoint.web.component.input.DatePanel)6 EmptyOnBlurAjaxFormUpdatingBehaviour (com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour)3 DateValidator (com.evolveum.midpoint.web.util.DateValidator)3 PropertyModel (org.apache.wicket.model.PropertyModel)3 AjaxSubmitButton (com.evolveum.midpoint.web.component.AjaxSubmitButton)2 TextPanel (com.evolveum.midpoint.web.component.input.TextPanel)2 InputPanel (com.evolveum.midpoint.web.component.prism.InputPanel)2 XMLGregorianCalendar (javax.xml.datatype.XMLGregorianCalendar)2 QName (javax.xml.namespace.QName)2 AjaxRequestTarget (org.apache.wicket.ajax.AjaxRequestTarget)2 WebMarkupContainer (org.apache.wicket.markup.html.WebMarkupContainer)2 Form (org.apache.wicket.markup.html.form.Form)2 PasswordPanel (com.evolveum.midpoint.gui.api.component.password.PasswordPanel)1 ItemPathDto (com.evolveum.midpoint.gui.api.component.path.ItemPathDto)1 ItemPathPanel (com.evolveum.midpoint.gui.api.component.path.ItemPathPanel)1 CanonicalItemPath (com.evolveum.midpoint.prism.path.CanonicalItemPath)1 ItemPath (com.evolveum.midpoint.prism.path.ItemPath)1 PolyString (com.evolveum.midpoint.prism.polystring.PolyString)1 MidpointForm (com.evolveum.midpoint.web.component.form.MidpointForm)1 MultiValueChoosePanel (com.evolveum.midpoint.web.component.form.multivalue.MultiValueChoosePanel)1