From 6fa6f627b1706561e0d11b44be45dbc35bba5d41 Mon Sep 17 00:00:00 2001
From: xiaoding721 <33130084+xiaoding721@users.noreply.github.com>
Date: 星期三, 29 五月 2024 19:44:12 +0800
Subject: [PATCH] Merge branch 'dev' of http://47.101.211.7:10101/r/VWED into dev

---
 _Main/BL/Type_LibCal_SubscriberEventRow/_ROOT_Type_LibCal_SubscriberEventRow.qbl                                                               |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelDate_DateSelectorEndTime_OnChanged.def                        |   16 
 _Main/BL/Type_LibCal_SubscriberEventTable/Attribute_Name.qbl                                                                                   |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelDate.def                                                     |   56 ++
 _Main/BL/Type_LibCal_SubscriberEventTable/Attribute_ID.qbl                                                                                     |    8 
 _Main/BL/Type_LibCal_SubscriberEventTable/StaticMethod_InitializeTable.qbl                                                                     |   22 +
 _Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeWeek.qbl                                                                            |   32 +
 _Main/BL/Relations/Relation_LibCal_Calendar_LibCal_SubscriberEventTable_LibCal_SubscriberEventT.qbl                                            |   23 +
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_matrixeditorContextMenuTable.def                                  |   10 
 _Main/BL/Type_LibCal_SubscriberEventRow/Attribute_EventType.qbl                                                                                |    8 
 _Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_RowName.qbl                                                                               |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_lstSubscribers_mnDelete_OnClick.def                                |   26 +
 _Main/BL/Type_LibCal_SubscriberEventRow/Attribute_Subscriber.qbl                                                                               |    8 
 _Main/BL/Type_LibCal_SubscriberEventColumn/Method_FilterByDatePeriod.qbl                                                                       |   19 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelPeriods_RadioButtonGroupUseForPlanning_OnChanged.def          |   22 +
 _Main/BL/Relations/Relation_LibCal_SubscriberEventTable_LibCal_SubscriberEventColumn_LibCal_Sub.qbl                                            |   26 +
 _Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeDay.qbl                                                                             |   29 +
 _Main/BL/Type_LibCal_Calendar/_ROOT_Type_LibCal_Calendar.qbl                                                                                   |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelPeriods.def                                                  |   29 +
 _Main/BL/Type_LibCal_SubscriberEventCell/Attribute_Value.qbl                                                                                   |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_MatrixEditorTable.def                                             |  100 ++++
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_lstSubscribers_OnCheckedChanged.def                                |   20 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_OnCreated.def                                                      |   17 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelExport_ButtonInitialize_OnClick.def                           |   16 
 _Main/BL/Relations/Relation_LibCal_SubscriberEventCell_LibCal_SubscriberEventColumn_LibCal_Subs.qbl                                            |   26 +
 _Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_Period.qbl                                                                                |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarSearchList.def                                       |    5 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_pnlSubscribers#549.def                                            |   49 ++
 _Main/UI/MacroPlannerWebApp/Views/Calendar_unavailable_event_view.vw                                                                           |  140 ++++++
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarUnavailableEventSearchList.def                       |    2 
 _Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_Index.qbl                                                                                 |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_matrixEditorActionBarPageTable.def                                |   10 
 _Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeMonth.qbl                                                                           |   32 +
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelList.def                                                     |   15 
 _Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_Name.qbl                                                                                  |    8 
 _Main/BL/Type_LibCal_SubscriberEventColumn/Function_CalcIndex.qbl                                                                              |   13 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelExport.def                                                   |   35 +
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_lstSubscribers_OnSelectionChanged.def                              |   32 +
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_lstSubscribers.def                                                |   61 ++
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarUnavailableEvent.def                                 |   35 +
 _Main/BL/Type_LibCal_SubscriberEventRow/Attribute_RowNr.qbl                                                                                    |    8 
 _Main/BL/Type_LibCal_SubscriberEventCell/_ROOT_Type_LibCal_SubscriberEventCell.qbl                                                             |   10 
 _Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_ListList.def                                                           |    2 
 _Main/BL/Relations/Relation_LibCal_SubscriberEventCell_LibCal_SubscriberEventRow_LibCal_Subscri.qbl                                            |   23 +
 _Main/BL/Type_LibCal_SubscriberEventRow/Method_FilterBySubscriberAndEventType.qbl                                                              |   17 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuCapacities_MenuCapacitiesUnavailableEvent_O.def |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Method_InitializeSubscribers.def                                            |   39 +
 _Main/BL/Type_LibCal_SubscriberEventColumn/_ROOT_Type_LibCal_SubscriberEventColumn.qbl                                                         |   10 
 _Main/BL/Type_LibCal_SubscriberEventRow/Attribute_Event.qbl                                                                                    |    8 
 _Main/BL/Relations/Relation_LibCal_SubscriberEventTable_LibCal_SubscriberEventRow_LibCal_Subscr.qbl                                            |   23 +
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelExport_ButtonHeader_OnClick.def                               |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_cmSubscribers.def                                                 |   24 +
 /dev/null                                                                                                                                      |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarEventTypes.def                                       |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelHeader.def                                                   |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_abpListSubscribers.def                                            |   10 
 _Main/BL/Type_LibCal_SubscriberEventTable/_ROOT_Type_LibCal_SubscriberEventTable.qbl                                                           |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelDate_DateSelectorStartTime_OnChanged.def                      |   16 
 _Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeTable.qbl                                                                           |   56 ++
 59 files changed, 1,295 insertions(+), 14 deletions(-)

diff --git a/_Main/BL/Relations/Relation_LibCal_Calendar_LibCal_SubscriberEventTable_LibCal_SubscriberEventT.qbl b/_Main/BL/Relations/Relation_LibCal_Calendar_LibCal_SubscriberEventTable_LibCal_SubscriberEventT.qbl
new file mode 100644
index 0000000..6331a56
--- /dev/null
+++ b/_Main/BL/Relations/Relation_LibCal_Calendar_LibCal_SubscriberEventTable_LibCal_SubscriberEventT.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation LibCal_Calendar_LibCal_SubscriberEventTable_LibCal_SubscriberEventTable_LibCal_Calendar
+{
+  #keys: '1[415136.0.671975041]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide LibCal_SubscriberEventTable
+  {
+    #keys: '3[415136.0.671975043][415136.0.671975042][415136.0.671975044]'
+    Cardinality: '1toN'
+    ObjectDefinition: LibCal_Calendar
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide LibCal_Calendar
+  {
+    #keys: '3[415136.0.671975046][415136.0.671975045][415136.0.671975047]'
+    Cardinality: '0to1'
+    ObjectDefinition: LibCal_SubscriberEventTable
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_LibCal_SubscriberEventCell_LibCal_SubscriberEventColumn_LibCal_Subs.qbl b/_Main/BL/Relations/Relation_LibCal_SubscriberEventCell_LibCal_SubscriberEventColumn_LibCal_Subs.qbl
new file mode 100644
index 0000000..8d66f99
--- /dev/null
+++ b/_Main/BL/Relations/Relation_LibCal_SubscriberEventCell_LibCal_SubscriberEventColumn_LibCal_Subs.qbl
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: #root
+Relation LibCal_SubscriberEventCell_LibCal_SubscriberEventColumn_LibCal_SubscriberEventColumn_LibCal_SubscriberEventCell
+{
+  #keys: '1[415136.0.671975141]'
+  ProceduralSequenceRelationStrategy
+  {
+    #keys: '13[0.0.0][415136.0.671975193][415136.0.671975187][415136.0.671975194][415136.0.671975188][415136.0.671975195][415136.0.671975189][415136.0.671975196][415136.0.671975190][415136.0.671975197][415136.0.671975191][415136.0.671975198][415136.0.671975192]'
+    SequenceElementSuffix: 'CellInColumn'
+    SequenceSuffix: 'CellInColumn'
+  }
+  RelationSide.LeftSide LibCal_SubscriberEventColumn
+  {
+    #keys: '3[415136.0.671975143][415136.0.671975142][415136.0.671975144]'
+    Cardinality: '0to1'
+    ObjectDefinition: LibCal_SubscriberEventCell
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide LibCal_SubscriberEventCell
+  {
+    #keys: '3[415136.0.671975146][415136.0.671975145][415136.0.671975147]'
+    Cardinality: '1toN'
+    ObjectDefinition: LibCal_SubscriberEventColumn
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_LibCal_SubscriberEventCell_LibCal_SubscriberEventRow_LibCal_Subscri.qbl b/_Main/BL/Relations/Relation_LibCal_SubscriberEventCell_LibCal_SubscriberEventRow_LibCal_Subscri.qbl
new file mode 100644
index 0000000..567256c
--- /dev/null
+++ b/_Main/BL/Relations/Relation_LibCal_SubscriberEventCell_LibCal_SubscriberEventRow_LibCal_Subscri.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation LibCal_SubscriberEventCell_LibCal_SubscriberEventRow_LibCal_SubscriberEventRow_LibCal_SubscriberEventCell
+{
+  #keys: '1[415136.0.671975174]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide LibCal_SubscriberEventRow
+  {
+    #keys: '3[415136.0.671975176][415136.0.671975175][415136.0.671975177]'
+    Cardinality: '0to1'
+    ObjectDefinition: LibCal_SubscriberEventCell
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide LibCal_SubscriberEventCell
+  {
+    #keys: '3[415136.0.671975179][415136.0.671975178][415136.0.671975180]'
+    Cardinality: '1toN'
+    ObjectDefinition: LibCal_SubscriberEventRow
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_LibCal_SubscriberEventTable_LibCal_SubscriberEventColumn_LibCal_Sub.qbl b/_Main/BL/Relations/Relation_LibCal_SubscriberEventTable_LibCal_SubscriberEventColumn_LibCal_Sub.qbl
new file mode 100644
index 0000000..8626761
--- /dev/null
+++ b/_Main/BL/Relations/Relation_LibCal_SubscriberEventTable_LibCal_SubscriberEventColumn_LibCal_Sub.qbl
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: #root
+Relation LibCal_SubscriberEventTable_LibCal_SubscriberEventColumn_LibCal_SubscriberEventColumn_LibCal_SubscriberEventTable
+{
+  #keys: '1[415136.0.671975067]'
+  ProceduralSequenceRelationStrategy
+  {
+    #keys: '13[0.0.0][415136.0.671975160][415136.0.671975154][415136.0.671975161][415136.0.671975155][415136.0.671975162][415136.0.671975156][415136.0.671975163][415136.0.671975157][415136.0.671975164][415136.0.671975158][415136.0.671975165][415136.0.671975159]'
+    SequenceElementSuffix: 'Column'
+    SequenceSuffix: 'Column'
+  }
+  RelationSide.LeftSide LibCal_SubscriberEventColumn
+  {
+    #keys: '3[415136.0.671975069][415136.0.671975068][415136.0.671975070]'
+    Cardinality: '1toN'
+    ObjectDefinition: LibCal_SubscriberEventTable
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide LibCal_SubscriberEventTable
+  {
+    #keys: '3[415136.0.671975072][415136.0.671975071][415136.0.671975073]'
+    Cardinality: '0to1'
+    ObjectDefinition: LibCal_SubscriberEventColumn
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_LibCal_SubscriberEventTable_LibCal_SubscriberEventRow_LibCal_Subscr.qbl b/_Main/BL/Relations/Relation_LibCal_SubscriberEventTable_LibCal_SubscriberEventRow_LibCal_Subscr.qbl
new file mode 100644
index 0000000..aa1813b
--- /dev/null
+++ b/_Main/BL/Relations/Relation_LibCal_SubscriberEventTable_LibCal_SubscriberEventRow_LibCal_Subscr.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation LibCal_SubscriberEventTable_LibCal_SubscriberEventRow_LibCal_SubscriberEventRow_LibCal_SubscriberEventTable
+{
+  #keys: '1[415136.0.671975080]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide LibCal_SubscriberEventRow
+  {
+    #keys: '3[415136.0.671975082][415136.0.671975081][415136.0.671975083]'
+    Cardinality: '1toN'
+    ObjectDefinition: LibCal_SubscriberEventTable
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide LibCal_SubscriberEventTable
+  {
+    #keys: '3[415136.0.671975085][415136.0.671975084][415136.0.671975086]'
+    Cardinality: '0to1'
+    ObjectDefinition: LibCal_SubscriberEventRow
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Type_LibCal_Calendar/_ROOT_Type_LibCal_Calendar.qbl b/_Main/BL/Type_LibCal_Calendar/_ROOT_Type_LibCal_Calendar.qbl
new file mode 100644
index 0000000..9954fa6
--- /dev/null
+++ b/_Main/BL/Type_LibCal_Calendar/_ROOT_Type_LibCal_Calendar.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type LibCal_Calendar #extension
+{
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventCell/Attribute_Value.qbl b/_Main/BL/Type_LibCal_SubscriberEventCell/Attribute_Value.qbl
new file mode 100644
index 0000000..52c06e3
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventCell/Attribute_Value.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Value
+{
+  #keys: '3[415136.0.671975132][415136.0.671975131][415136.0.671975133]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventCell/_ROOT_Type_LibCal_SubscriberEventCell.qbl b/_Main/BL/Type_LibCal_SubscriberEventCell/_ROOT_Type_LibCal_SubscriberEventCell.qbl
new file mode 100644
index 0000000..eb5f4a1
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventCell/_ROOT_Type_LibCal_SubscriberEventCell.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type LibCal_SubscriberEventCell
+{
+  #keys: '5[415136.0.671975128][415136.0.671975126][0.0.0][415136.0.671975127][415136.0.671975129]'
+  BaseType: Object
+  Description: '鏃ュ巻涓嶅彲鐢ㄤ簨浠惰〃鐨勫崟鍏冩牸'
+  StructuredName: 'LibCal_SubscriberEventCells'
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_Index.qbl b/_Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_Index.qbl
new file mode 100644
index 0000000..9f9b90f
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_Index.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Index
+{
+  #keys: '3[415136.0.671975104][415136.0.671975103][415136.0.671975105]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_Name.qbl b/_Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_Name.qbl
new file mode 100644
index 0000000..cc1f250
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_Name.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[415136.0.671975094][415136.0.671975093][415136.0.671975095]'
+  Description: '鍚嶇О'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_Period.qbl b/_Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_Period.qbl
new file mode 100644
index 0000000..20255d7
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_Period.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Period
+{
+  #keys: '3[415136.0.703300314][415136.0.703300313][415136.0.703300315]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_RowName.qbl b/_Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_RowName.qbl
new file mode 100644
index 0000000..18f8e87
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_RowName.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute RowName
+{
+  #keys: '3[415136.0.674522587][415136.0.674522586][415136.0.674522588]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventColumn/Function_CalcIndex.qbl b/_Main/BL/Type_LibCal_SubscriberEventColumn/Function_CalcIndex.qbl
new file mode 100644
index 0000000..3c88455
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventColumn/Function_CalcIndex.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcIndex
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� May-28-2024 (created)
+    
+    value := ifexpr( isnull( this.PreviousColumn() ), 0, this.PreviousColumn().Index() + 1 )
+    
+    this.Index( value );
+  *]
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventColumn/Method_FilterByDatePeriod.qbl b/_Main/BL/Type_LibCal_SubscriberEventColumn/Method_FilterByDatePeriod.qbl
new file mode 100644
index 0000000..ae7bf3d
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventColumn/Method_FilterByDatePeriod.qbl
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: #root
+Method FilterByDatePeriod (
+  Date start,
+  Date end
+) declarative remote as Boolean
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� May-29-2024 (created)
+    value := false;
+    info( this.Index(), this.Period(), start, end );
+    if( this.Index() < 2  ){
+        value := true;
+    }
+    
+    return value;
+  *]
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventColumn/_ROOT_Type_LibCal_SubscriberEventColumn.qbl b/_Main/BL/Type_LibCal_SubscriberEventColumn/_ROOT_Type_LibCal_SubscriberEventColumn.qbl
new file mode 100644
index 0000000..8e692f1
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventColumn/_ROOT_Type_LibCal_SubscriberEventColumn.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type LibCal_SubscriberEventColumn
+{
+  #keys: '5[415136.0.671975059][415136.0.671975057][0.0.0][415136.0.671975058][415136.0.671975060]'
+  BaseType: Object
+  Description: '鏃ュ巻涓嶅彲鐢ㄤ簨浠惰〃鐨勫垪'
+  StructuredName: 'LibCal_SubscriberEventColumns'
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventRow/Attribute_Event.qbl b/_Main/BL/Type_LibCal_SubscriberEventRow/Attribute_Event.qbl
new file mode 100644
index 0000000..40c3b95
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventRow/Attribute_Event.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Event
+{
+  #keys: '3[415136.0.675350014][415136.0.675350013][415136.0.675350015]'
+  Description: '浜嬩欢'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventRow/Attribute_EventType.qbl b/_Main/BL/Type_LibCal_SubscriberEventRow/Attribute_EventType.qbl
new file mode 100644
index 0000000..3352d3d
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventRow/Attribute_EventType.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute EventType
+{
+  #keys: '3[415136.0.675350024][415136.0.675350023][415136.0.675350025]'
+  Description: '浜嬩欢绫诲瀷'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventRow/Attribute_RowNr.qbl b/_Main/BL/Type_LibCal_SubscriberEventRow/Attribute_RowNr.qbl
new file mode 100644
index 0000000..d1182a6
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventRow/Attribute_RowNr.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute RowNr
+{
+  #keys: '3[415136.0.671975114][415136.0.671975113][415136.0.671975115]'
+  IsReadOnly: true
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventRow/Attribute_Subscriber.qbl b/_Main/BL/Type_LibCal_SubscriberEventRow/Attribute_Subscriber.qbl
new file mode 100644
index 0000000..ab40273
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventRow/Attribute_Subscriber.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Subscriber
+{
+  #keys: '3[415136.0.671975222][415136.0.671975221][415136.0.671975223]'
+  Description: '浜х嚎'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventRow/Method_FilterBySubscriberAndEventType.qbl b/_Main/BL/Type_LibCal_SubscriberEventRow/Method_FilterBySubscriberAndEventType.qbl
new file mode 100644
index 0000000..10b43b0
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventRow/Method_FilterBySubscriberAndEventType.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+Method FilterBySubscriberAndEventType (
+  LibCal_Calendars subscribers
+) declarative remote as Boolean
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� May-29-2024 (created)
+    value := false;
+    if( exists( subscribers, Elements, e, e.CalendarID() = this.Subscriber() ) ){
+      value := true;
+    }
+    
+    return value;
+  *]
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventRow/_ROOT_Type_LibCal_SubscriberEventRow.qbl b/_Main/BL/Type_LibCal_SubscriberEventRow/_ROOT_Type_LibCal_SubscriberEventRow.qbl
new file mode 100644
index 0000000..f4dfaba
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventRow/_ROOT_Type_LibCal_SubscriberEventRow.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type LibCal_SubscriberEventRow
+{
+  #keys: '5[415136.0.671975064][415136.0.671975062][0.0.0][415136.0.671975063][415136.0.671975065]'
+  BaseType: Object
+  Description: '鏃ュ巻涓嶅彲鐢ㄤ簨浠惰〃鐨勮'
+  StructuredName: 'LibCal_SubscriberEventRows'
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventTable/Attribute_ID.qbl b/_Main/BL/Type_LibCal_SubscriberEventTable/Attribute_ID.qbl
new file mode 100644
index 0000000..0d0a699
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventTable/Attribute_ID.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ID
+{
+  #keys: '3[415136.0.671975032][415136.0.671975031][415136.0.671975033]'
+  IsReadOnly: true
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventTable/Attribute_Name.qbl b/_Main/BL/Type_LibCal_SubscriberEventTable/Attribute_Name.qbl
new file mode 100644
index 0000000..b3a426f
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventTable/Attribute_Name.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[415136.0.671975022][415136.0.671975021][415136.0.671975023]'
+  Description: '鍚嶇О'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeDay.qbl b/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeDay.qbl
new file mode 100644
index 0000000..c60a7d7
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeDay.qbl
@@ -0,0 +1,29 @@
+Quintiq file version 2.0
+#parent: #root
+Method InitializeDay (
+  LibCal_SubscriberEventTable table,
+  LibCal_SubscriberEventRow row,
+  DateTime starttime,
+  DateTime endtime
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� May-29-2024 (created)
+    for(  startTime := starttime; startTime < endtime; startTime := startTime.StartOfNextDay() ){
+      time := startTime.Format( 'M/D/Y' );
+      column := selectobject( table, LibCal_SubscriberEventColumn, column, column.Name() = time );
+      if( isnull( column ) ){
+        column := table.LibCal_SubscriberEventColumn( relnew, Name := time, Period := startTime.Date() );
+      }
+      
+      duration := startTime.StartOfNextDay() - startTime;
+      if( startTime.StartOfNextDay() > endtime ){
+        duration := endtime - startTime;
+      }
+    //  info( startTime, column.Name(), duration.AsQUILL(), duration.HoursAsReal() );
+      cell := column.LibCal_SubscriberEventCell( relnew, Value := [String]duration.HoursAsReal() );
+      row.LibCal_SubscriberEventCell( relinsert, cell );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeMonth.qbl b/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeMonth.qbl
new file mode 100644
index 0000000..8010e2b
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeMonth.qbl
@@ -0,0 +1,32 @@
+Quintiq file version 2.0
+#parent: #root
+Method InitializeMonth (
+  LibCal_SubscriberEventTable table,
+  LibCal_SubscriberEventRow row,
+  DateTime starttime,
+  DateTime endtime
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� May-29-2024 (created)
+    for(  startTime := starttime; startTime < endtime; startTime := startTime.StartOfNextMonth() ){
+      time := startTime;
+      if( starttime = startTime ){
+        time := startTime.StartOfMonth();
+      }
+      column := selectobject( table, LibCal_SubscriberEventColumn, column, column.Name() = time.Format( 'M/D/Y' ) );
+      if( isnull( column ) ){
+        column := table.LibCal_SubscriberEventColumn( relnew, Name := time.Format( 'M/D/Y' ), Period := time.Date() );
+      }
+      
+      duration := startTime.StartOfNextMonth() - startTime;
+      if( startTime.StartOfNextMonth() > endtime ){
+        duration := endtime - startTime;
+      }
+    //  info( startTime, column.Name(), duration.AsQUILL(), duration.HoursAsReal() );
+      cell := column.LibCal_SubscriberEventCell( relnew, Value := [String]duration.HoursAsReal() );
+      row.LibCal_SubscriberEventCell( relinsert, cell );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeTable.qbl b/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeTable.qbl
new file mode 100644
index 0000000..61af153
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeTable.qbl
@@ -0,0 +1,56 @@
+Quintiq file version 2.0
+#parent: #root
+Method InitializeTable (
+  LibCal_Calendars subscribers,
+  LibCal_EventCategory category
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� May-28-2024 (created)
+    rownr                 := this.LibCal_SubscriberEventRow( relsize );
+    subscribercolumn      := selectobject( this, LibCal_SubscriberEventColumn, column, column.RowName() = 'Line' );
+    if( isnull( subscribercolumn ) ){
+      subscribercolumn := this.LibCal_SubscriberEventColumn( relnew, RowName := 'Line' );
+    }
+    eventcolumn := selectobject( this, LibCal_SubscriberEventColumn, column, column.RowName() = 'Event' );
+    if( isnull( eventcolumn ) ){
+      eventcolumn := this.LibCal_SubscriberEventColumn( relnew, RowName := 'Event' );
+    }
+    timezone := this.LibCal_Calendar().GetTimeZone();
+    
+    traverse( subscribers, Elements, subscriber ){
+    //  info( '------------------------', subscriber.CalendarID(), subscriber.CalendarType() );
+    //  traverse( subscriber,Participation.astype( LibCal_Subscription ).LeadingParticipation, participation ){
+      traverse( subscriber,Participation.astype( LibCal_Subscription ).LeadingParticipation, participation, participation.Event().EventCategory() = category ){
+    //    info( '------------------------', participation.Event().Subject(), '------', participation.Event().EventCategory().Name() );
+        event := participation.Event();
+        row := selectobject( this, LibCal_SubscriberEventRow, row, row.Subscriber() = subscriber.CalendarID() and row.Event() = event.Subject() and row.EventType() = event.EventType() );
+        if( isnull( row ) ){
+          row := this.LibCal_SubscriberEventRow( relnew, RowNr := rownr, Subscriber := subscriber.CalendarID(), Event := event.Subject(), EventType := event.EventType() );
+          
+          if( counter( this, LibCal_SubscriberEventRow, linerow, linerow.Subscriber() = row.Subscriber() ) = 1 ){
+            subscribercell := subscribercolumn.LibCal_SubscriberEventCell( relnew, Value := row.Subscriber() );
+            row.LibCal_SubscriberEventCell( relinsert, subscribercell );
+          }
+          
+          eventcell := eventcolumn.LibCal_SubscriberEventCell( relnew, Value := row.Event() );
+          row.LibCal_SubscriberEventCell( relinsert, eventcell );
+          rownr := rownr + 1;
+        }
+    
+        endTime     := participation.EndDate().DateTime( timezone ).AddAsPeriod( timezone, event.EndTimeOfDay() );
+        startTime   := participation.StartDate().DateTime( timezone ).AddAsPeriod( timezone, event.StartTimeOfDay() );
+    //    info( this.ID(), startTime, endTime );
+        if( this.ID() = 'Day' ){
+          this.InitializeDay( this, row, startTime, endTime );
+        }else if( this.ID() = 'Week' ){
+          this.InitializeWeek( this, row, startTime, endTime );
+        }else{
+          this.InitializeMonth( this, row, startTime, endTime );
+        }
+    
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeWeek.qbl b/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeWeek.qbl
new file mode 100644
index 0000000..d1da787
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeWeek.qbl
@@ -0,0 +1,32 @@
+Quintiq file version 2.0
+#parent: #root
+Method InitializeWeek (
+  LibCal_SubscriberEventTable table,
+  LibCal_SubscriberEventRow row,
+  DateTime starttime,
+  DateTime endtime
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� May-29-2024 (created)
+    for(  startTime := starttime; startTime < endtime; startTime := startTime.StartOfNextWeek() ){
+      time := startTime;
+      if( starttime = startTime ){
+        time := startTime.StartOfWeek();
+      }
+      column := selectobject( table, LibCal_SubscriberEventColumn, column, column.Name() = time.Format( 'M/D/Y' ) );
+      if( isnull( column ) ){
+        column := table.LibCal_SubscriberEventColumn( relnew, Name := time.Format( 'M/D/Y' ), Period := time.Date() );
+      }
+      
+      duration := startTime.StartOfNextWeek() - startTime;
+      if( startTime.StartOfNextWeek() > endtime ){
+        duration := endtime - startTime;
+      }
+    //  info( startTime, column.Name(), duration.AsQUILL(), duration.HoursAsReal() );
+      cell := column.LibCal_SubscriberEventCell( relnew, Value := [String]duration.HoursAsReal() );
+      row.LibCal_SubscriberEventCell( relinsert, cell );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventTable/StaticMethod_InitializeTable.qbl b/_Main/BL/Type_LibCal_SubscriberEventTable/StaticMethod_InitializeTable.qbl
new file mode 100644
index 0000000..bbeff88
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventTable/StaticMethod_InitializeTable.qbl
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod InitializeTable (
+  LibCal_Calendars subscribers,
+  LibCal_Calendar owner,
+  LibCal_EventCategory category
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� May-28-2024 (created)
+    if( owner.LibCal_SubscriberEventTable( relsize ) < 1 ){
+      owner.LibCal_SubscriberEventTable( relnew, ID := 'Day', Name := 'Day' );
+      owner.LibCal_SubscriberEventTable( relnew, ID := 'Week', Name := 'Week' );
+      owner.LibCal_SubscriberEventTable( relnew, ID := 'Month', Name := 'Month' );
+    }
+    info('-----------------------------', owner.LibCal_SubscriberEventTable( relsize ), subscribers.Size(), isnull( category ) );
+    traverse( owner, LibCal_SubscriberEventTable, table ){
+      table.InitializeTable( subscribers, category );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventTable/_ROOT_Type_LibCal_SubscriberEventTable.qbl b/_Main/BL/Type_LibCal_SubscriberEventTable/_ROOT_Type_LibCal_SubscriberEventTable.qbl
new file mode 100644
index 0000000..4a55c54
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventTable/_ROOT_Type_LibCal_SubscriberEventTable.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type LibCal_SubscriberEventTable
+{
+  #keys: '5[415136.0.671975018][415136.0.671975016][0.0.0][415136.0.671975017][415136.0.671975019]'
+  BaseType: Object
+  Description: '鏃ュ巻涓嶅彲鐢ㄤ簨浠惰〃'
+  StructuredName: 'LibCal_SubscriberEventTables'
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuCapacities_MenuCapacitiesUnavailableEvent_O.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuCapacities_MenuCapacitiesUnavailableEvent_O.def
new file mode 100644
index 0000000..b7ac572
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuCapacities_MenuCapacitiesUnavailableEvent_O.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: ContextMenuCapacities/MenuCapacitiesUnavailableEvent
+Response OnClick () id:Response_MacroPlanner_ContextMenuCapacities_MenuCapacitiesUnavailableEvent_OnClick
+{
+  #keys: '[415136.0.667550585]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebMenu_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationScope.ViewManager().ResetUserViewById( "Calendar_unavailable_event_view", true);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_MatrixEditorTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_MatrixEditorTable.def
new file mode 100644
index 0000000..4a8f9f1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_MatrixEditorTable.def
@@ -0,0 +1,100 @@
+Quintiq file version 2.0
+Component MatrixEditorTable
+{
+  #keys: '[415136.0.671350612]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorTableCell
+    {
+      #keys: '[415136.0.671350613]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractorTableCell
+        {
+          #keys: '[415136.0.671350614]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LibCal_SubscriberEventTable'
+            Source: 'dhTable'
+            Taborder: 0
+            Transformation: 'LibCal_SubscriberEventColumn.LibCal_SubscriberEventCell'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'Value'
+        Column: 'LibCal_SubscriberEventColumn'
+        Row: 'LibCal_SubscriberEventRow'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorTableRows
+    {
+      #keys: '[415136.0.671350617]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorTableRows
+        {
+          #keys: '[415136.0.671350618]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LibCal_SubscriberEventTable'
+            FilterArguments: 'subscribers:dhSubscribers'
+            FixedFilter: 'object.FilterBySubscriberAndEventType( subscribers )'
+            Source: 'dhTable'
+            Taborder: 0
+            Transformation: 'LibCal_SubscriberEventRow'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'RowNr'
+        SortCriteria: 'RowNr'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorTableColumns
+    {
+      #keys: '[415136.0.671350621]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorTableColumns
+        {
+          #keys: '[415136.0.671350622]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LibCal_SubscriberEventTable'
+            FilterArguments: 'starttime:dhStartDate;endtime:dhEndDate'
+            Source: 'dhTable'
+            Taborder: 0
+            Transformation: 'LibCal_SubscriberEventColumn'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'Index'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPageTable
+    #child: matrixeditorContextMenuTable
+  ]
+  Properties:
+  [
+    Columns: 'MatrixEditorTableColumns'
+    ContextMenu: 'matrixeditorContextMenuTable'
+    Rows: 'MatrixEditorTableRows'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarEventTypes.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarEventTypes.def
index 506d63d..dfbdbdc 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarEventTypes.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarEventTypes.def
@@ -5,6 +5,8 @@
   BaseType: 'WebPanel'
   Properties:
   [
+    FixedSize: true
+    MinimumColumns: 39
     Taborder: 1
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarLineList.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarLineList.def
deleted file mode 100644
index c7e0337..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarLineList.def
+++ /dev/null
@@ -1,10 +0,0 @@
-Quintiq file version 2.0
-Component PanelCalendarLineList
-{
-  #keys: '[415136.0.658772834]'
-  BaseType: 'WebPanel'
-  Properties:
-  [
-    Taborder: 0
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarSearchList.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarSearchList.def
index bdaa56e..46c190a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarSearchList.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarSearchList.def
@@ -5,12 +5,13 @@
   BaseType: 'WebPanel'
   Children:
   [
-    #child: PanelCalendarLineList
     #child: PanelCalendarEventTypes
+    #child: pnlSubscribers_549
   ]
   Properties:
   [
+    FixedSize: true
     Orientation: 'horizontal'
-    Taborder: 0
+    Taborder: 2
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarUnavailableEvent.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarUnavailableEvent.def
index bf94026..907d686 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarUnavailableEvent.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarUnavailableEvent.def
@@ -7,6 +7,41 @@
   [
     #child: PanelCalendarSearchList
     #child: PanelCalendarUnavailableEventSearchList
+    Component dhCalendar
+    {
+      #keys: '[415136.0.701850574]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'LibCal_Calendar'
+      Children:
+      [
+        Component deCalendar
+        {
+          #keys: '[415136.0.701850618]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LibCal_CalendarRegistry'
+            Source: 'LibCal_GlobalState.dhGlobalCalendarRegistry'
+            Taborder: 0
+            Transformation: 'CommonCalendar'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 0
+      ]
+    }
+    Component dhCategory
+    {
+      #keys: '[415136.0.701811642]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'LibCal_EventCategory'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarUnavailableEventSearchList.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarUnavailableEventSearchList.def
index d2d3188..eedf788 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarUnavailableEventSearchList.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelCalendarUnavailableEventSearchList.def
@@ -10,6 +10,6 @@
   ]
   Properties:
   [
-    Taborder: 1
+    Taborder: 3
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelDate.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelDate.def
new file mode 100644
index 0000000..72e7e87
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelDate.def
@@ -0,0 +1,56 @@
+Quintiq file version 2.0
+Component PanelDate
+{
+  #keys: '[415136.0.668311160]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component DateSelectorStartTime id:DateSelectorStartTime_806
+    {
+      #keys: '[415136.0.668311203]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        Label: 'Start time'
+        Taborder: 0
+      ]
+    }
+    Component DateSelectorEndTime id:DateSelectorEndTime_819
+    {
+      #keys: '[415136.0.668311223]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        Date: 9999-12-31
+        Label: 'End time'
+        Taborder: 1
+      ]
+    }
+    Component dhStartDate id:dhStartDate_529
+    {
+      #keys: '[415136.0.701820404]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'Date'
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+    Component dhEndDate id:dhEndDate_480
+    {
+      #keys: '[415136.0.701820426]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'Date'
+      Properties:
+      [
+        Taborder: 3
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelExport.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelExport.def
new file mode 100644
index 0000000..15a8928
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelExport.def
@@ -0,0 +1,35 @@
+Quintiq file version 2.0
+Component PanelExport
+{
+  #keys: '[415136.0.668311240]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ButtonHeader id:ButtonHeader_763
+    {
+      #keys: '[415136.0.668311275]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Taborder: 0
+      ]
+    }
+    Component ButtonInitialize
+    {
+      #keys: '[415136.0.670072471]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'ARROW_CIRCLE'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 2
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelHeader.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelHeader.def
index 862e4b3..8e47e62 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelHeader.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelHeader.def
@@ -3,8 +3,15 @@
 {
   #keys: '[415136.0.658772785]'
   BaseType: 'WebPanel'
+  Children:
+  [
+    #child: PanelPeriods
+    #child: PanelDate
+    #child: PanelExport
+  ]
   Properties:
   [
+    FixedSize: true
     Orientation: 'horizontal'
     Taborder: 0
   ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelList.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelList.def
index 45c2dd3..3a1f26f 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelList.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelList.def
@@ -3,6 +3,21 @@
 {
   #keys: '[415136.0.658772810]'
   BaseType: 'WebPanel'
+  Children:
+  [
+    #child: MatrixEditorTable
+    Component dhTable
+    {
+      #keys: '[415136.0.672310139]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'LibCal_SubscriberEventTable'
+      Properties:
+      [
+        Description: '琛�'
+        Taborder: 0
+      ]
+    }
+  ]
   Properties:
   [
     Taborder: 1
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelPeriods.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelPeriods.def
new file mode 100644
index 0000000..2b876f1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelPeriods.def
@@ -0,0 +1,29 @@
+Quintiq file version 2.0
+Component PanelPeriods
+{
+  #keys: '[415136.0.667550798]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component RadioButtonGroupUseForPlanning
+    {
+      #keys: '[415136.0.667550833]'
+      BaseType: 'WebRadioButtonGroup'
+      Properties:
+      [
+        BoundValue: 'Day'
+        ButtonLabels: 'Day;Week;Month'
+        ButtonValues: 'Day;Week;Month'
+        Orientation: 'horizontal'
+        Taborder: 0
+        Title: 'Periods'
+        Tooltip: '<html>Select if the periods are used for planning or merely for visualization.<br>The planning periods define the granularity at which planning is done.<br>In case of overlapping planning periods, the smallest ones are used.<br>The planning periods are shown in the period overview in blue.</html>'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Orientation: 'horizontal'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_abpListSubscribers.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_abpListSubscribers.def
new file mode 100644
index 0000000..255f2ff
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_abpListSubscribers.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component abpListSubscribers
+{
+  #keys: '[415136.0.666211731]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 2
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_cmSubscribers.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_cmSubscribers.def
new file mode 100644
index 0000000..d4f0c9a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_cmSubscribers.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+Component cmSubscribers
+{
+  #keys: '[415136.0.666211729]'
+  BaseType: 'listContextMenu'
+  Children:
+  [
+    Component mnDelete
+    {
+      #keys: '[415136.0.666211730]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'DELETE'
+        Taborder: 3
+        Title: 'Delete'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_lstSubscribers.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_lstSubscribers.def
new file mode 100644
index 0000000..9c401e7
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_lstSubscribers.def
@@ -0,0 +1,61 @@
+Quintiq file version 2.0
+Component lstSubscribers
+{
+  #keys: '[415136.0.666211726]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component deSubscribers
+    {
+      #keys: '[415136.0.666211727]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'structured[LibCal_Calendar]'
+        Source: 'dhPotentialSubscribers'
+        Taborder: 0
+        Transformation: 'Elements'
+      ]
+    }
+    Component dslSubscribers
+    {
+      #keys: '[415136.0.666211728]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: cmSubscribers
+      ]
+      Properties:
+      [
+        Columns: 'CalendarID'
+        ContextMenu: 'cmSubscribers'
+        SortCriteria: 'CalendarID'
+        Taborder: 1
+      ]
+    }
+    #child: abpListSubscribers
+  ]
+  Properties:
+  [
+    SelectionCheckboxes: true
+    Taborder: 3
+  ]
+  ResponseDefinitions:
+  [
+    DelegatedResponseDefinition OnClick id:Responsedef_lstSubscribers_WebMenu_OnClick
+    {
+      #keys: '[415136.0.666211718]'
+      Initiator: 'WebMenu'
+      IsInherited: false
+      ResponseType: 'OnClick'
+      Arguments:
+      [
+        ResponseDefinitionArgument selection
+        {
+          #keys: '[3739.0.1873455]'
+          Binding: 'this.Selection()'
+        }
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_matrixEditorActionBarPageTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_matrixEditorActionBarPageTable.def
new file mode 100644
index 0000000..ff511d4
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_matrixEditorActionBarPageTable.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPageTable
+{
+  #keys: '[415136.0.671350625]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_matrixeditorContextMenuTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_matrixeditorContextMenuTable.def
new file mode 100644
index 0000000..bf8934c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_matrixeditorContextMenuTable.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenuTable
+{
+  #keys: '[415136.0.671350628]'
+  BaseType: 'matrixeditorContextMenu'
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_pnlSubscribers\043549.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_pnlSubscribers\043549.def"
new file mode 100644
index 0000000..03eddc3
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_pnlSubscribers\043549.def"
@@ -0,0 +1,49 @@
+Quintiq file version 2.0
+Component pnlSubscribers id:pnlSubscribers_549
+{
+  #keys: '[415136.0.666211724]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component dhPotentialSubscribers
+    {
+      #keys: '[415136.0.666211725]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[LibCal_Calendar]*'
+      Properties:
+      [
+        Taborder: 0
+      ]
+    }
+    #child: lstSubscribers
+    Component lblIsInitialized
+    {
+      #keys: '[415136.0.666211733]'
+      BaseType: 'WebLabel'
+      Properties:
+      [
+        Taborder: 2
+        Text: 'false'
+        Visible: false
+      ]
+    }
+    Component dhSubscribers
+    {
+      #keys: '[415136.0.666211734]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[LibCal_Calendar]*'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Border: true
+    FixedSize: true
+    MinimumColumns: 39
+    Taborder: 0
+    Title: 'Subscribers'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Method_InitializeSubscribers.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Method_InitializeSubscribers.def
new file mode 100644
index 0000000..cdc74a7
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Method_InitializeSubscribers.def
@@ -0,0 +1,39 @@
+Quintiq file version 2.0
+#parent: #root
+Method InitializeSubscribers () id:Method_FormCalendarUnavailableEvent_InitializeSubscribers
+{
+  #keys: '[415136.0.666291565]'
+  Body:
+  [*
+    owner_i := LibCal_GlobalState.dhGlobalCalendarRegistry().Data().CommonCalendar();
+    category_i := selectobject( owner_i,CalendarRegistry.EventCategory, category, category.Name() = 'Unavaliable' );
+    dhCategory.Data(category_i);
+    
+    sEvent := owner_i.Event( relshadow,
+                             EventID        := [String]Key::NextPersistentKey(),
+    //                         StartTimeOfDay := start_i.TimeOfDay( timezone ),
+    //                         EndTimeOfDay   := end_i  .TimeOfDay( timezone ),
+                             EventCategory  := category_i,
+                             IsDefault      := false );
+    
+    sLeadPart := owner_i.Participation( relshadow, LibCal_LeadingParticipation,
+                                        ParticipationID := [String]Key::NextPersistentKey()
+    //                                    ,StartDate       := start_i.Date( timezone ),
+    //                                    EndDate         := end_i  .Date( timezone ) 
+                                        );
+    
+    calendar             := sLeadPart.Calendar();
+    potentialSubscribers := calendar.GetPotentialSubscribers();
+    
+    // Remove the calendar of the initiator (cannot subscribe to self).
+    initiator := sEvent.Calendar();
+    if( potentialSubscribers.Find( initiator ) >= 0 )
+    {
+      potentialSubscribers.Remove( initiator );
+    }
+    
+    dhPotentialSubscribers.Data( &potentialSubscribers );
+    
+    lstSubscribers.CheckAll();
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_OnCreated.def
new file mode 100644
index 0000000..04b4ca1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_OnCreated.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+Response OnCreated () id:Response_FormCalendarUnavailableEvent_OnCreated
+{
+  #keys: '[415136.0.667561809]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      
+      this.InitializeSubscribers();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelDate_DateSelectorEndTime_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelDate_DateSelectorEndTime_OnChanged.def
new file mode 100644
index 0000000..4e64dd2
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelDate_DateSelectorEndTime_OnChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelDate/DateSelectorEndTime_819
+Response OnChanged () id:Response_PanelDate_DateSelectorEndTime_OnChanged
+{
+  #keys: '[415136.0.701820524]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDateTimeFieldBase_OnChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      dhEndDate.Data(this.Date());
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelDate_DateSelectorStartTime_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelDate_DateSelectorStartTime_OnChanged.def
new file mode 100644
index 0000000..d99c1d8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelDate_DateSelectorStartTime_OnChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelDate/DateSelectorStartTime_806
+Response OnChanged () id:Response_PanelDate_DateSelectorStartTime_OnChanged
+{
+  #keys: '[415136.0.701820445]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDateTimeFieldBase_OnChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      dhStartDate.Data(this.Date());
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelExport_ButtonHeader_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelExport_ButtonHeader_OnClick.def
new file mode 100644
index 0000000..d5d9e0a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelExport_ButtonHeader_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelExport/ButtonHeader_763
+Response OnClick () id:Response_PanelExport_ButtonHeader_OnClick
+{
+  #keys: '[415136.0.676930317]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      info( '--------------------------------', dhStartDate.Data(), dhEndDate.Data() )
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelExport_ButtonInitialize_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelExport_ButtonInitialize_OnClick.def
new file mode 100644
index 0000000..e275403
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelExport_ButtonInitialize_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelExport/ButtonInitialize
+Response OnClick () id:Response_PanelExport_ButtonInitialize_OnClick
+{
+  #keys: '[415136.0.670072520]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      LibCal_SubscriberEventTable::InitializeTable( dhPotentialSubscribers.Data(), dhCalendar.Data(), dhCategory.Data() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelPeriods_RadioButtonGroupUseForPlanning_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelPeriods_RadioButtonGroupUseForPlanning_OnChanged.def
new file mode 100644
index 0000000..833c721
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelPeriods_RadioButtonGroupUseForPlanning_OnChanged.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: PanelPeriods/RadioButtonGroupUseForPlanning
+Response OnChanged () id:Response_PanelPeriods_RadioButtonGroupUseForPlanning_OnChanged
+{
+  #keys: '[415136.0.672310167]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebRadioButtonGroup_OnChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      owner_i := LibCal_GlobalState.dhGlobalCalendarRegistry().Data().CommonCalendar();
+      if( owner_i.LibCal_SubscriberEventTable( relsize ) < 1 ){
+        LibCal_SubscriberEventTable::InitializeTable( dhPotentialSubscribers.Data(), dhCalendar.Data(), dhCategory.Data() );
+      }
+      table := selectobject( owner_i, LibCal_SubscriberEventTable, table, table.ID() = this.BoundValue() );
+      
+      dhTable.Data( table );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_lstSubscribers_OnCheckedChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_lstSubscribers_OnCheckedChanged.def
new file mode 100644
index 0000000..363759b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_lstSubscribers_OnCheckedChanged.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: lstSubscribers
+Response OnCheckedChanged (
+  structured[LibCal_Calendar] checkeditems
+) id:Response_lstSubscribers_OnCheckedChanged
+{
+  #keys: '[415136.0.666211720]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebList_OnCheckedChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      subscribers := checkeditems.Copy();
+      subscribers.Sort( attribute( LibCal_Calendar, CalendarID ), true );
+      dhSubscribers.Data( &subscribers );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_lstSubscribers_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_lstSubscribers_OnSelectionChanged.def
new file mode 100644
index 0000000..b5a2634
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_lstSubscribers_OnSelectionChanged.def
@@ -0,0 +1,32 @@
+Quintiq file version 2.0
+#parent: lstSubscribers
+Response OnSelectionChanged (
+  LibCal_Calendar selection
+) id:Response_lstSubscribers_OnSelectionChanged
+{
+  #keys: '[415136.0.666211719]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebList_OnSelectionChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      // Initialize the list by setting the checkmark for the subscribing calendars when this has not been done before.
+      // This should only be done when OnSelectionChanged is executed for the first time.
+      //if( lblIsInitialized.Text() = "false" )
+      //{
+      //  // Get the calendars of the subscriptions.
+      //  calendars := selectset( dhEvent.Data(), LeadingParticipation.Subscription.Calendar, calendar, true, true ).Unique();
+      //  
+      //  traverse( calendars, Elements, subscriber )
+      //  {
+      //    lstSubscribers.ExtendCheckByKey( subscriber.Key() );
+      //  }
+      //    
+      //  // Register that the list has been initialized.
+      //  lblIsInitialized.Text( "true" );
+      //}
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_lstSubscribers_mnDelete_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_lstSubscribers_mnDelete_OnClick.def
new file mode 100644
index 0000000..5849adc
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_lstSubscribers_mnDelete_OnClick.def
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: lstSubscribers
+Response OnClick (
+  structured[LibCal_Subscription] selection
+) id:Response_lstSubscribers_mnDelete_OnClick
+{
+  #keys: '[415136.0.666211722]'
+  CanBindMultiple: false
+  DefinitionID => /lstSubscribers/Responsedef_lstSubscribers_WebMenu_OnClick
+  Initiator: 'mnDelete'
+  QuillAction
+  {
+    Body:
+    [*
+      traverse( selection, Elements, e ){
+        leadingP := e.LeadingParticipation();
+        if( leadingP.Subscription( relsize ) > 0 ){
+          leadingP.Event().Delete();
+          leadingP.Delete();
+        }
+        e.Delete();
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_ListList.def b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_ListList.def
index 4ab4363..eeeb5f2 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_ListList.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_ListList.def
@@ -28,7 +28,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Calendar.CalendarID","title":"CalendarID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Calendar.CalendarID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Event.Subject","title":"Subject","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Event.Subject"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StartDate","title":"StartDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StartDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Event.StartTimeOfDay","title":"StartTimeOfDay","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Event.StartTimeOfDay"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Event.EndTimeOfDay","title":"EndTimeOfDay","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Event.EndTimeOfDay"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Event.Description","title":"Description","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Event.Description"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Calendar.CalendarID","title":"CalendarID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Calendar.CalendarID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Event.EventType","title":"EventType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Event.EventType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Event.Subject","title":"Subject","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Event.Subject"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StartDate","title":"StartDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StartDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Event.StartTimeOfDay","title":"StartTimeOfDay","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Event.StartTimeOfDay"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Event.EndTimeOfDay","title":"EndTimeOfDay","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Event.EndTimeOfDay"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Event.Description","title":"Description","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Event.Description"}}]'
         ContextMenu: 'listContextMenu967'
         Taborder: 2
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Views/Calendar_unavailable_event_view.vw b/_Main/UI/MacroPlannerWebApp/Views/Calendar_unavailable_event_view.vw
new file mode 100644
index 0000000..6391363
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/Calendar_unavailable_event_view.vw
@@ -0,0 +1,140 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormCalendarUnavailableEvent
+      {
+        title: 'QMacroPlanner::FormCalendarUnavailableEvent'
+        shown: true
+        componentID: 'QMacroPlanner::FormCalendarUnavailableEvent'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 16
+          columnPosition: 1
+          columnSpan: 12
+        }
+        components
+        {
+          FormCalendarUnavailableEvent_PanelCalendarUnavailableEvent
+          {
+            sizeRatio: 1
+          }
+          FormCalendarUnavailableEvent_PanelCalendarSearchList
+          {
+            sizeRatio: 1
+          }
+          FormCalendarUnavailableEvent_pnlSubscribers
+          {
+            sizeRatio: 1
+          }
+          FormCalendarUnavailableEvent_lstSubscribers
+          {
+          }
+          FormCalendarUnavailableEvent_dslSubscribers
+          {
+            groupDepth: -1
+            column_CalendarID
+            {
+              columnId: 'CalendarID'
+              dataPath: 'CalendarID'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+          }
+          FormCalendarUnavailableEvent_PanelCalendarEventTypes
+          {
+            sizeRatio: 1
+          }
+          FormCalendarUnavailableEvent_PanelCalendarUnavailableEventSearchList
+          {
+            sizeRatio: 1
+          }
+          FormCalendarUnavailableEvent_PanelHeader
+          {
+            sizeRatio: 1
+          }
+          FormCalendarUnavailableEvent_PanelDate
+          {
+            sizeRatio: 1
+          }
+          FormCalendarUnavailableEvent_PanelPeriods
+          {
+            sizeRatio: 1
+          }
+          FormCalendarUnavailableEvent_PanelExport
+          {
+            sizeRatio: 1
+          }
+          FormCalendarUnavailableEvent_PanelList
+          {
+            sizeRatio: 1
+          }
+          FormCalendarUnavailableEvent_MatrixEditorTable
+          {
+            gridColor: '#c4c4c4'
+            totalHeaderWidth: 37
+            attributeHeaderWidthRatio: 0.6
+            nameHeaderWidthRatio: 0.4
+            columnWidth: 238
+            horizontalGrid: true
+            verticalGrid: true
+            backendState
+            {
+              componentId: 'QMacroPlanner::FormCalendarUnavailableEvent.MatrixEditorTable'
+              state
+              {
+                cells
+                {
+                  attributes
+                  {
+                    attribute_Value
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 0
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'Value'
+                    }
+                  }
+                }
+                columns
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'Index'"
+                  }
+                }
+                rows
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'RowNr'"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    page: ''
+    group: ''
+    index: 13
+    image: 'CALENDAR_PREFERENCES'
+    description: ''
+  }
+  formatversion: 2
+  id: 'Calendar_unavailable_event_view'
+  name: 'Calendar unavailable event view'
+  isglobal: false
+  isroot: true
+}

--
Gitblit v1.9.3