Browse Source

Dashboard - Widgets: Add Content widget, enhance Icon widget.

fusionate 1 year ago
parent
commit
69f0118439

+ 17 - 2
core/dashboard/app_config.php

@@ -72,15 +72,30 @@
 		$apps[$x]['db'][$y]['fields'][$z]['search_by'] = '';
 		$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = 'Enter the dashboard path.';
 		$z++;
+		$apps[$x]['db'][$y]['fields'][$z]['name'] = 'dashboard_icon';
+		$apps[$x]['db'][$y]['fields'][$z]['type'] = 'text';
+		$apps[$x]['db'][$y]['fields'][$z]['search_by'] = '';
+		$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = 'Enter the dashboard icon.';
+		$z++;
 		$apps[$x]['db'][$y]['fields'][$z]['name'] = 'dashboard_url';
 		$apps[$x]['db'][$y]['fields'][$z]['type'] = 'text';
 		$apps[$x]['db'][$y]['fields'][$z]['search_by'] = '';
 		$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = 'Enter the dashboard url.';
 		$z++;
-		$apps[$x]['db'][$y]['fields'][$z]['name'] = 'dashboard_icon';
+		$apps[$x]['db'][$y]['fields'][$z]['name'] = 'dashboard_target';
 		$apps[$x]['db'][$y]['fields'][$z]['type'] = 'text';
 		$apps[$x]['db'][$y]['fields'][$z]['search_by'] = '';
-		$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = 'Enter the dashboard icon.';
+		$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = 'Enter the dashboard target.';
+		$z++;
+		$apps[$x]['db'][$y]['fields'][$z]['name'] = 'dashboard_content';
+		$apps[$x]['db'][$y]['fields'][$z]['type'] = 'text';
+		$apps[$x]['db'][$y]['fields'][$z]['search_by'] = '';
+		$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = 'Enter the dashboard top content.';
+		$z++;
+		$apps[$x]['db'][$y]['fields'][$z]['name'] = 'dashboard_content_details';
+		$apps[$x]['db'][$y]['fields'][$z]['type'] = 'text';
+		$apps[$x]['db'][$y]['fields'][$z]['search_by'] = '';
+		$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = 'Enter the dashboard top content details.';
 		$z++;
 		$apps[$x]['db'][$y]['fields'][$z]['name'] = 'dashboard_chart_type';
 		$apps[$x]['db'][$y]['fields'][$z]['type'] = 'text';

+ 124 - 46
core/dashboard/app_languages.php

@@ -234,6 +234,84 @@ $text['label-dashboard_groups']['zh-cn'] = "团体";
 $text['label-dashboard_groups']['ja-jp'] = "グループ";
 $text['label-dashboard_groups']['ko-kr'] = "여러 떼";
 
+$text['description-dashboard_target']['en-us'] = "Specify the target of the Link.";
+$text['description-dashboard_target']['en-gb'] = "Specify the target of the Link.";
+$text['description-dashboard_target']['ar-eg'] = "حدد هدف الارتباط.";
+$text['description-dashboard_target']['de-at'] = "Geben Sie das Ziel des Links an.";
+$text['description-dashboard_target']['de-ch'] = "Geben Sie das Ziel des Links an.";
+$text['description-dashboard_target']['de-de'] = "Geben Sie das Ziel des Links an.";
+$text['description-dashboard_target']['el-gr'] = "Καθορίστε τον στόχο του συνδέσμου.";
+$text['description-dashboard_target']['es-cl'] = "Especifique el destino del enlace.";
+$text['description-dashboard_target']['es-mx'] = "Especifique el destino del enlace.";
+$text['description-dashboard_target']['fr-ca'] = "Spécifiez la cible du lien.";
+$text['description-dashboard_target']['fr-fr'] = "Spécifiez la cible du lien.";
+$text['description-dashboard_target']['he-il'] = "ציין את היעד של הקישור.";
+$text['description-dashboard_target']['it-it'] = "Specificare la destinazione del collegamento.";
+$text['description-dashboard_target']['nl-nl'] = "Geef het doel van de link op.";
+$text['description-dashboard_target']['pl-pl'] = "Określ cel łącza.";
+$text['description-dashboard_target']['pt-br'] = "Especifique o destino do link.";
+$text['description-dashboard_target']['pt-pt'] = "Especifique o destino do link.";
+$text['description-dashboard_target']['ro-ro'] = "Specificați ținta Link-ului.";
+$text['description-dashboard_target']['ru-ru'] = "Укажите цель ссылки.";
+$text['description-dashboard_target']['sv-se'] = "Ange målet för länken.";
+$text['description-dashboard_target']['uk-ua'] = "Укажіть ціль посилання.";
+$text['description-dashboard_target']['tr-tr'] = "Bağlantının hedefini belirtin.";
+$text['description-dashboard_target']['zh-cn'] = "指定链接的目标。";
+$text['description-dashboard_target']['ja-jp'] = "リンクのターゲットを指定します。";
+$text['description-dashboard_target']['ko-kr'] = "링크의 대상을 지정합니다.";
+
+$text['description-dashboard_content']['en-us'] = "Enter the content (text) to display in the top section of the widget.";
+$text['description-dashboard_content']['en-gb'] = "Enter the content (text) to display in the top section of the widget.";
+$text['description-dashboard_content']['ar-eg'] = "أدخل المحتوى (النص) لعرضه في القسم العلوي من الأداة.";
+$text['description-dashboard_content']['de-at'] = "Geben Sie Inhalt (Text) ein, der im oberen Abschnitt des Widgets angezeigt werden soll.";
+$text['description-dashboard_content']['de-ch'] = "Geben Sie Inhalt (Text) ein, der im oberen Abschnitt des Widgets angezeigt werden soll.";
+$text['description-dashboard_content']['de-de'] = "Geben Sie Inhalt (Text) ein, der im oberen Abschnitt des Widgets angezeigt werden soll.";
+$text['description-dashboard_content']['el-gr'] = "Εισαγάγετε περιεχόμενο (κείμενο) για εμφάνιση στην επάνω ενότητα του γραφικού στοιχείου.";
+$text['description-dashboard_content']['es-cl'] = "Ingrese el contenido (texto) para mostrar en la sección superior del widget.";
+$text['description-dashboard_content']['es-mx'] = "Ingrese el contenido (texto) para mostrar en la sección superior del widget.";
+$text['description-dashboard_content']['fr-ca'] = "Saisissez le contenu (texte) à afficher dans la section supérieure du widget.";
+$text['description-dashboard_content']['fr-fr'] = "Saisissez le contenu (texte) à afficher dans la section supérieure du widget.";
+$text['description-dashboard_content']['he-il'] = "הזן תוכן (טקסט) להצגה בחלק העליון של הווידג'ט.";
+$text['description-dashboard_content']['it-it'] = "Inserisci il contenuto (testo) da visualizzare nella sezione superiore del widget.";
+$text['description-dashboard_content']['nl-nl'] = "Voer inhoud (tekst) in die in het bovenste gedeelte van de widget moet worden weergegeven.";
+$text['description-dashboard_content']['pl-pl'] = "Wprowadź treść (tekst), która będzie wyświetlana w górnej części widżetu.";
+$text['description-dashboard_content']['pt-br'] = "Insira o conteúdo (texto) a ser exibido na seção superior do widget.";
+$text['description-dashboard_content']['pt-pt'] = "Insira o conteúdo (texto) a ser exibido na seção superior do widget.";
+$text['description-dashboard_content']['ro-ro'] = "Introduceți conținut (text) de afișat în secțiunea de sus a widget-ului.";
+$text['description-dashboard_content']['ru-ru'] = "Введите контент (текст), который будет отображаться в верхней части виджета.";
+$text['description-dashboard_content']['sv-se'] = "Ange innehåll (text) som ska visas i den övre delen av widgeten.";
+$text['description-dashboard_content']['uk-ua'] = "Введіть вміст (текст) для відображення у верхній частині віджета.";
+$text['description-dashboard_content']['tr-tr'] = "Widget'ın üst bölümünde görüntülenecek içeriği (metni) girin.";
+$text['description-dashboard_content']['zh-cn'] = "输入要显示在小部件顶部的内容(文本)。";
+$text['description-dashboard_content']['ja-jp'] = "ウィジェットの上部セクションに表示するコンテンツ (テキスト) を入力します。";
+$text['description-dashboard_content']['ko-kr'] = "위젯 상단에 표시할 내용(텍스트)을 입력하세요.";
+
+$text['description-dashboard_content_details']['en-us'] = "Enter the content (text) to display in the bottom section of the widget.";
+$text['description-dashboard_content_details']['en-gb'] = "Enter the content (text) to display in the bottom section of the widget.";
+$text['description-dashboard_content_details']['ar-eg'] = "أدخل المحتوى (النص) الذي سيتم عرضه في القسم السفلي من الأداة.";
+$text['description-dashboard_content_details']['de-at'] = "Geben Sie den Inhalt (Text) ein, der im unteren Abschnitt des Widgets angezeigt werden soll.";
+$text['description-dashboard_content_details']['de-ch'] = "Geben Sie den Inhalt (Text) ein, der im unteren Abschnitt des Widgets angezeigt werden soll.";
+$text['description-dashboard_content_details']['de-de'] = "Geben Sie den Inhalt (Text) ein, der im unteren Abschnitt des Widgets angezeigt werden soll.";
+$text['description-dashboard_content_details']['el-gr'] = "Εισαγάγετε το περιεχόμενο (κείμενο) που θα εμφανιστεί στο κάτω τμήμα του γραφικού στοιχείου.";
+$text['description-dashboard_content_details']['es-cl'] = "Ingrese el contenido (texto) para mostrar en la sección inferior del widget.";
+$text['description-dashboard_content_details']['es-mx'] = "Ingrese el contenido (texto) para mostrar en la sección inferior del widget.";
+$text['description-dashboard_content_details']['fr-ca'] = "Saisissez le contenu (texte) à afficher dans la section inférieure du widget.";
+$text['description-dashboard_content_details']['fr-fr'] = "Saisissez le contenu (texte) à afficher dans la section inférieure du widget.";
+$text['description-dashboard_content_details']['he-il'] = "הזן את התוכן (טקסט) שיוצג בחלק התחתון של הווידג'ט.";
+$text['description-dashboard_content_details']['it-it'] = "Inserisci il contenuto (testo) da visualizzare nella sezione inferiore del widget.";
+$text['description-dashboard_content_details']['nl-nl'] = "Voer de inhoud (tekst) in die in het onderste gedeelte van de widget moet worden weergegeven.";
+$text['description-dashboard_content_details']['pl-pl'] = "Wprowadź treść (tekst), która będzie wyświetlana w dolnej części widżetu.";
+$text['description-dashboard_content_details']['pt-br'] = "Insira o conteúdo (texto) a ser exibido na seção inferior do widget.";
+$text['description-dashboard_content_details']['pt-pt'] = "Insira o conteúdo (texto) a ser exibido na seção inferior do widget.";
+$text['description-dashboard_content_details']['ro-ro'] = "Introduceți conținutul (textul) de afișat în secțiunea de jos a widget-ului.";
+$text['description-dashboard_content_details']['ru-ru'] = "Введите содержимое (текст), которое будет отображаться в нижней части виджета.";
+$text['description-dashboard_content_details']['sv-se'] = "Ange innehållet (texten) som ska visas i den nedre delen av widgeten.";
+$text['description-dashboard_content_details']['uk-ua'] = "Введіть вміст (текст) для відображення в нижній частині віджета.";
+$text['description-dashboard_content_details']['tr-tr'] = "Widget'ın alt bölümünde görüntülenecek içeriği (metni) girin.";
+$text['description-dashboard_content_details']['zh-cn'] = "输入要在小部件底部显示的内容(文本)。";
+$text['description-dashboard_content_details']['ja-jp'] = "ウィジェットの下部に表示するコンテンツ (テキスト) を入力します。";
+$text['description-dashboard_content_details']['ko-kr'] = "위젯 하단에 표시할 내용(텍스트)을 입력하세요.";
+
 $text['description-dashboard_groups']['en-us'] = "Add the groups that have permission to this widget.";
 $text['description-dashboard_groups']['en-gb'] = "Add the groups that have permission to this widget.";
 $text['description-dashboard_groups']['ar-eg'] = "أضف المجموعات التي لديها إذن إلى هذه الأداة.";
@@ -652,55 +730,55 @@ $text['description-dashboard_column_span']['ko-kr'] = "대시보드 위젯 열 
 
 $text['label-dashboard_row_span']['en-us'] = "Row Span";
 $text['label-dashboard_row_span']['en-gb'] = "Row Span";
-$text['label-dashboard_row_span']['ar-eg'] = "";
-$text['label-dashboard_row_span']['de-at'] = "";
-$text['label-dashboard_row_span']['de-ch'] = "";
-$text['label-dashboard_row_span']['de-de'] = "";
-$text['label-dashboard_row_span']['el-gr'] = "";
-$text['label-dashboard_row_span']['es-cl'] = "";
-$text['label-dashboard_row_span']['es-mx'] = "";
-$text['label-dashboard_row_span']['fr-ca'] = "";
-$text['label-dashboard_row_span']['fr-fr'] = "";
-$text['label-dashboard_row_span']['he-il'] = "";
-$text['label-dashboard_row_span']['it-it'] = "";
-$text['label-dashboard_row_span']['nl-nl'] = "";
-$text['label-dashboard_row_span']['pl-pl'] = "";
-$text['label-dashboard_row_span']['pt-br'] = "";
-$text['label-dashboard_row_span']['pt-pt'] = "";
-$text['label-dashboard_row_span']['ro-ro'] = "";
-$text['label-dashboard_row_span']['ru-ru'] = "";
-$text['label-dashboard_row_span']['sv-se'] = "";
-$text['label-dashboard_row_span']['uk-ua'] = "";
-$text['label-dashboard_row_span']['tr-tr'] = "";
-$text['label-dashboard_row_span']['zh-cn'] = "";
-$text['label-dashboard_row_span']['ja-jp'] = "";
-$text['label-dashboard_row_span']['ko-kr'] = "";
+$text['label-dashboard_row_span']['ar-eg'] = "نطاق الصف";
+$text['label-dashboard_row_span']['de-at'] = "Zeilenspanne";
+$text['label-dashboard_row_span']['de-ch'] = "Zeilenspanne";
+$text['label-dashboard_row_span']['de-de'] = "Zeilenspanne";
+$text['label-dashboard_row_span']['el-gr'] = "Άνοιγμα σειράς";
+$text['label-dashboard_row_span']['es-cl'] = "Distancia entre filas";
+$text['label-dashboard_row_span']['es-mx'] = "Distancia entre filas";
+$text['label-dashboard_row_span']['fr-ca'] = "Portée des lignes";
+$text['label-dashboard_row_span']['fr-fr'] = "Portée des lignes";
+$text['label-dashboard_row_span']['he-il'] = "טווח שורה";
+$text['label-dashboard_row_span']['it-it'] = "Intervallo di riga";
+$text['label-dashboard_row_span']['nl-nl'] = "Rij-spanwijdte";
+$text['label-dashboard_row_span']['pl-pl'] = "Rozpiętość wierszy";
+$text['label-dashboard_row_span']['pt-br'] = "Expansão de linha";
+$text['label-dashboard_row_span']['pt-pt'] = "Expansão de linha";
+$text['label-dashboard_row_span']['ro-ro'] = "Row Span";
+$text['label-dashboard_row_span']['ru-ru'] = "Диапазон строк";
+$text['label-dashboard_row_span']['sv-se'] = "Radspann";
+$text['label-dashboard_row_span']['uk-ua'] = "Radspann";
+$text['label-dashboard_row_span']['tr-tr'] = "Satır Aralığı";
+$text['label-dashboard_row_span']['zh-cn'] = "行跨度";
+$text['label-dashboard_row_span']['ja-jp'] = "行スパン";
+$text['label-dashboard_row_span']['ko-kr'] = "행 범위";
 
 $text['description-dashboard_row_span']['en-us'] = "Enter the dashboard widget row span.";
 $text['description-dashboard_row_span']['en-gb'] = "Enter the dashboard widget row span.";
-$text['description-dashboard_row_span']['ar-eg'] = "";
-$text['description-dashboard_row_span']['de-at'] = "";
-$text['description-dashboard_row_span']['de-ch'] = "";
-$text['description-dashboard_row_span']['de-de'] = "";
-$text['description-dashboard_row_span']['el-gr'] = "";
-$text['description-dashboard_row_span']['es-cl'] = "";
-$text['description-dashboard_row_span']['es-mx'] = "";
-$text['description-dashboard_row_span']['fr-ca'] = "";
-$text['description-dashboard_row_span']['fr-fr'] = "";
-$text['description-dashboard_row_span']['he-il'] = "";
-$text['description-dashboard_row_span']['it-it'] = "";
-$text['description-dashboard_row_span']['nl-nl'] = "";
-$text['description-dashboard_row_span']['pl-pl'] = "";
-$text['description-dashboard_row_span']['pt-br'] = "";
-$text['description-dashboard_row_span']['pt-pt'] = "";
-$text['description-dashboard_row_span']['ro-ro'] = "";
-$text['description-dashboard_row_span']['ru-ru'] = "";
-$text['description-dashboard_row_span']['sv-se'] = "";
-$text['description-dashboard_row_span']['uk-ua'] = "";
-$text['description-dashboard_row_span']['tr-tr'] = "";
-$text['description-dashboard_row_span']['zh-cn'] = "";
-$text['description-dashboard_row_span']['ja-jp'] = "";
-$text['description-dashboard_row_span']['ko-kr'] = "";
+$text['description-dashboard_row_span']['ar-eg'] = "أدخل نطاق صف أداة لوحة المعلومات.";
+$text['description-dashboard_row_span']['de-at'] = "Geben Sie die Zeilenspanne des Dashboard-Widgets ein.";
+$text['description-dashboard_row_span']['de-ch'] = "Geben Sie die Zeilenspanne des Dashboard-Widgets ein.";
+$text['description-dashboard_row_span']['de-de'] = "Geben Sie die Zeilenspanne des Dashboard-Widgets ein.";
+$text['description-dashboard_row_span']['el-gr'] = "Εισαγάγετε το εύρος της γραμμής του γραφικού στοιχείου του πίνακα εργαλείων.";
+$text['description-dashboard_row_span']['es-cl'] = "Ingrese el intervalo de filas del widget del panel.";
+$text['description-dashboard_row_span']['es-mx'] = "Ingrese el intervalo de filas del widget del panel.";
+$text['description-dashboard_row_span']['fr-ca'] = "Entrez l'étendue des lignes du widget du tableau de bord.";
+$text['description-dashboard_row_span']['fr-fr'] = "Entrez l'étendue des lignes du widget du tableau de bord.";
+$text['description-dashboard_row_span']['he-il'] = "הזן את טווח שורות הווידג'ט של לוח המחוונים.";
+$text['description-dashboard_row_span']['it-it'] = "Inserisci l'intervallo di righe del widget del dashboard.";
+$text['description-dashboard_row_span']['nl-nl'] = "Voer de rijreeks van de dashboardwidget in.";
+$text['description-dashboard_row_span']['pl-pl'] = "Insira a extensão da linha do widget do painel.";
+$text['description-dashboard_row_span']['pt-br'] = "Insira a extensão da linha do widget do painel.";
+$text['description-dashboard_row_span']['pt-pt'] = "Insira a extensão da linha do widget do painel.";
+$text['description-dashboard_row_span']['ro-ro'] = "Introduceți intervalul de rânduri widget din tabloul de bord.";
+$text['description-dashboard_row_span']['ru-ru'] = "Введите диапазон строк виджета информационной панели.";
+$text['description-dashboard_row_span']['sv-se'] = "Ange radspann för instrumentpanelens widget.";
+$text['description-dashboard_row_span']['uk-ua'] = "Введіть діапазон рядків віджета інформаційної панелі.";
+$text['description-dashboard_row_span']['tr-tr'] = "Kontrol paneli widget'ı satır aralığını girin.";
+$text['description-dashboard_row_span']['zh-cn'] = "输入仪表板小部件行跨度。";
+$text['description-dashboard_row_span']['ja-jp'] = "ダッシュボード ウィジェットの行範囲を入力します。";
+$text['description-dashboard_row_span']['ko-kr'] = "대시보드 위젯 행 범위를 입력합니다.";
 
 $text['label-dashboard_details_state']['en-us'] = "Details State";
 $text['label-dashboard_details_state']['en-gb'] = "Details State";

+ 157 - 98
core/dashboard/dashboard_edit.php

@@ -42,8 +42,12 @@
 //set the defaults
 	$dashboard_name = '';
 	$dashboard_path = 'core/dashboard/resources/dashboard/icon.php';
-	$dashboard_url = '';
+// 	$dashboard_path = '';
 	$dashboard_icon = '';
+	$dashboard_url = '';
+	$dashboard_target = 'self';
+	$dashboard_content = '';
+	$dashboard_content_details = '';
 	$dashboard_heading_text_color = '';
 	$dashboard_heading_background_color = '';
 	$dashboard_number_text_color = '';
@@ -72,6 +76,9 @@
 		$dashboard_path = $_POST["dashboard_path"] ?? '';
 		$dashboard_icon = $_POST["dashboard_icon"] ?? '';
 		$dashboard_url = $_POST["dashboard_url"] ?? '';
+		$dashboard_target = $_POST["dashboard_target"] ?? 'self';
+		$dashboard_content = $_POST["dashboard_content"] ?? '';
+		$dashboard_content_details = $_POST["dashboard_content_details"] ?? '';
 		$dashboard_groups = $_POST["dashboard_groups"] ?? '';
 		$dashboard_chart_type = $_POST["dashboard_chart_type"] ?? '';
 		$dashboard_heading_text_color = $_POST["dashboard_heading_text_color"] ?? '';
@@ -204,6 +211,9 @@
 			$array['dashboard'][0]['dashboard_path'] = $dashboard_path;
 			$array['dashboard'][0]['dashboard_icon'] = $dashboard_icon;
 			$array['dashboard'][0]['dashboard_url'] = $dashboard_url;
+			$array['dashboard'][0]['dashboard_target'] = $dashboard_target;
+			$array['dashboard'][0]['dashboard_content'] = $dashboard_content;
+			$array['dashboard'][0]['dashboard_content_details'] = $dashboard_content_details;
 			$array['dashboard'][0]['dashboard_chart_type'] = $dashboard_chart_type;
 			$array['dashboard'][0]['dashboard_heading_text_color'] = $dashboard_heading_text_color;
 			$array['dashboard'][0]['dashboard_heading_background_color'] = $dashboard_heading_background_color;
@@ -226,7 +236,7 @@
 					}
 				}
 			}
-//view_array($array);
+
 		//save the data
 			$database = new database;
 			$database->app_name = 'dashboard';
@@ -258,6 +268,9 @@
 		$sql .= " dashboard_path, ";
 		$sql .= " dashboard_icon, ";
 		$sql .= " dashboard_url, ";
+		$sql .= " dashboard_target, ";
+		$sql .= " dashboard_content, ";
+		$sql .= " dashboard_content_details, ";
 		$sql .= " dashboard_chart_type, ";
 		$sql .= " dashboard_heading_text_color, ";
 		$sql .= " dashboard_heading_background_color, ";
@@ -280,6 +293,9 @@
 			$dashboard_path = $row["dashboard_path"];
 			$dashboard_icon = $row["dashboard_icon"];
 			$dashboard_url = $row["dashboard_url"];
+			$dashboard_target = $row["dashboard_target"];
+			$dashboard_content = $row["dashboard_content"];
+			$dashboard_content_details = $row["dashboard_content_details"];
 			$dashboard_chart_type = $row["dashboard_chart_type"];
 			$dashboard_heading_text_color = $row["dashboard_heading_text_color"];
 			$dashboard_heading_background_color = $row["dashboard_heading_background_color"];
@@ -387,8 +403,26 @@
 		}
 	}
 
+// adjust form by type entered
+	echo "<script>\n";
+	echo "	function adjust_form() {\n";
+	echo "		if ($('#dashboard_path').val() == 'core/dashboard/resources/dashboard/icon.php') {\n";
+	echo "			$('.type_content').hide();\n";
+	echo "			$('.type_icon').show();\n";
+	echo "		}\n";
+	echo "		else if ($('#dashboard_path').val() == 'core/dashboard/resources/dashboard/content.php') {\n";
+	echo "			$('.type_icon').hide();\n";
+	echo "			$('.type_content').show();\n";
+	echo "		}\n";
+	echo "		else {\n";
+	echo "			$('.type_icon, .type_content').hide();\n";
+	echo "			$('.type_chart').show();\n";
+	echo "		}\n";
+	echo "	}\n";
+	echo "</script>\n";
+
 //show the content
-	echo "<form name='frm' id='frm' method='post' action=''>\n";
+	echo "<form name='frm' id='frm' method='post'>\n";
 	echo "<input class='formfld' type='hidden' name='dashboard_uuid' value='".escape($dashboard_uuid)."'>\n";
 
 	echo "<div class='action_bar' id='action_bar'>\n";
@@ -423,11 +457,11 @@
 	echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
 
 	echo "<tr>\n";
-	echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
+	echo "<td width='30%' class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
 	echo $text['label-dashboard_name'] ?? '';
 	echo "\n";
 	echo "</td>\n";
-	echo "<td class='vtable' style='position: relative;' align='left'>\n";
+	echo "<td width='70%' class='vtable' style='position: relative;' align='left'>\n";
 	echo "	<input class='formfld' type='text' name='dashboard_name' maxlength='255' value='".escape($dashboard_name)."'>\n";
 	echo "<br />\n";
 	echo $text['description-dashboard_name']."\n";
@@ -439,66 +473,118 @@
 	echo "	".$text['label-dashboard_path']."\n";
 	echo "</td>\n";
 	echo "<td class='vtable' style='position: relative;' align='left'>\n";
-	echo "	<input class='formfld' type='text' name='dashboard_path' maxlength='255' value='".escape($dashboard_path)."'>\n";
+	echo "	<input class='formfld' type='text' name='dashboard_path' id='dashboard_path' maxlength='255' value='".escape($dashboard_path)."' onblur=\"adjust_form();\">\n";
 	echo "<br />\n";
 	echo $text['description-dashboard_path']."\n";
 	echo "</td>\n";
 	echo "</tr>\n";
 
-	echo "<tr>\n";
-	echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
-	echo "	".$text['label-link']."\n";
-	echo "</td>\n";
-	echo "<td class='vtable' style='position: relative;' align='left'>\n";
-	echo "	<input class='formfld' type='text' name='dashboard_url' maxlength='255' value='".escape($dashboard_url)."'>\n";
-	echo "<br />\n";
-	echo $text['description-dashboard_url'] ?? '';
-	echo "\n";
-	echo "</td>\n";
-	echo "</tr>\n";
-
-	echo "	<tr>";
-	echo "		<td class='vncell'>".$text['label-icon']."</td>";
-	echo "		<td class='vtable' style='vertical-align: bottom;'>";
-	if (file_exists($_SERVER["PROJECT_ROOT"].'/resources/fontawesome/fas_icons.php')) {
-		include 'resources/fontawesome/fas_icons.php';
-		if (is_array($font_awesome_solid_icons) && @sizeof($font_awesome_solid_icons) != 0) {
-			// rebuild and sort array
-			foreach ($font_awesome_solid_icons as $i => $icon_class) {
-				$icon_label = str_replace('fa-', '', $icon_class);
-				$icon_label = str_replace('-', ' ', $icon_label);
-				$icon_label = ucwords($icon_label);
-				$icons[$icon_class] = $icon_label;
-			}
-			asort($icons, SORT_STRING);
-			echo "<table cellpadding='0' cellspacing='0' border='0'>\n";
-			echo "	<tr>\n";
-			echo "		<td>\n";
-			echo "			<select class='formfld' name='dashboard_icon' id='dashboard_icon' onchange=\"$('#icons').slideUp(); $('#grid_icon').fadeIn();\">\n";
-			echo "				<option value=''></option>\n";
-			foreach ($icons as $icon_class => $icon_label) {
-				$selected = ($dashboard_icon == $icon_class) ? "selected" : null;
-				echo "			<option value='".escape($icon_class)."' ".$selected.">".escape($icon_label)."</option>\n";
-			}
-			echo "			</select>\n";
-			echo "		</td>\n";
-			echo "		<td style='padding: 0 0 0 5px;'>\n";
-			echo "			<button id='grid_icon' type='button' class='btn btn-default list_control_icon' style='font-size: 15px; padding-top: 1px; padding-left: 3px;' onclick=\"$('#icons').fadeIn(); $(this).fadeOut();\"><span class='fas fa-th'></span></button>";
-			echo "		</td>\n";
-			echo "	</tr>\n";
-			echo "</table>\n";
-			echo "<div id='icons' style='clear: both; display: none; margin-top: 8px; padding-top: 10px; color: #000; max-height: 400px; overflow: auto;'>\n";
-			foreach ($icons as $icon_class => $icon_label) {
-				echo "<span class='fas ".escape($icon_class)." fa-fw' style='font-size: 24px; float: left; margin: 0 8px 8px 0; cursor: pointer; opacity: 0.3;' title='".escape($icon_label)."' onclick=\"$('#dashboard_icon').val('".escape($icon_class)."'); $('#icons').slideUp(); $('#grid_icon').fadeIn();\" onmouseover=\"this.style.opacity='1';\" onmouseout=\"this.style.opacity='0.3';\"></span>\n";
+	if (
+		$action == "add" ||
+		$dashboard_path == "core/dashboard/resources/dashboard/icon.php"
+		) {
+		echo "	<tr class='type_icon' ".($dashboard_path != 'core/dashboard/resources/dashboard/icon.php' ? "style='display: none;'" : null).">";
+		echo "		<td class='vncell'>".$text['label-icon']."</td>";
+		echo "		<td class='vtable' style='vertical-align: bottom;'>";
+		if (file_exists($_SERVER["PROJECT_ROOT"].'/resources/fontawesome/fas_icons.php')) {
+			include 'resources/fontawesome/fas_icons.php';
+			if (is_array($font_awesome_solid_icons) && @sizeof($font_awesome_solid_icons) != 0) {
+				// rebuild and sort array
+				foreach ($font_awesome_solid_icons as $i => $icon_class) {
+					$icon_label = str_replace('fa-', '', $icon_class);
+					$icon_label = str_replace('-', ' ', $icon_label);
+					$icon_label = ucwords($icon_label);
+					$icons[$icon_class] = $icon_label;
+				}
+				asort($icons, SORT_STRING);
+				echo "<table cellpadding='0' cellspacing='0' border='0'>\n";
+				echo "	<tr>\n";
+				echo "		<td>\n";
+				echo "			<select class='formfld' name='dashboard_icon' id='dashboard_icon' onchange=\"$('#icons').slideUp(); $('#grid_icon').fadeIn();\">\n";
+				echo "				<option value=''></option>\n";
+				foreach ($icons as $icon_class => $icon_label) {
+					$selected = ($dashboard_icon == $icon_class) ? "selected" : null;
+					echo "			<option value='".escape($icon_class)."' ".$selected.">".escape($icon_label)."</option>\n";
+				}
+				echo "			</select>\n";
+				echo "		</td>\n";
+				echo "		<td style='padding: 0 0 0 5px;'>\n";
+				echo "			<button id='grid_icon' type='button' class='btn btn-default list_control_icon' style='font-size: 15px; padding-top: 1px; padding-left: 3px;' onclick=\"$('#icons').fadeIn(); $(this).fadeOut();\"><span class='fas fa-th'></span></button>";
+				echo "		</td>\n";
+				echo "	</tr>\n";
+				echo "</table>\n";
+				echo "<div id='icons' style='clear: both; display: none; margin-top: 8px; padding-top: 10px; color: #000; max-height: 400px; overflow: auto;'>\n";
+				foreach ($icons as $icon_class => $icon_label) {
+					echo "<span class='fas ".escape($icon_class)." fa-fw' style='font-size: 24px; float: left; margin: 0 8px 8px 0; cursor: pointer; opacity: 0.3;' title='".escape($icon_label)."' onclick=\"$('#dashboard_icon').val('".escape($icon_class)."'); $('#icons').slideUp(); $('#grid_icon').fadeIn();\" onmouseover=\"this.style.opacity='1';\" onmouseout=\"this.style.opacity='0.3';\"></span>\n";
+				}
+				echo "</div>";
 			}
-			echo "</div>";
 		}
+		else {
+			echo "		<input type='text' class='formfld' name='dashboard_icon' value='".escape($dashboard_icon)."'>";
+		}
+		echo "		</td>";
+		echo "	</tr>";
+
+		echo "<tr class='type_icon' ".($dashboard_path != 'core/dashboard/resources/dashboard/icon.php' ? "style='display: none;'" : null).">\n";
+		echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
+		echo "	".$text['label-link']."\n";
+		echo "</td>\n";
+		echo "<td class='vtable' align='left'>\n";
+		echo "	<input class='formfld' type='text' name='dashboard_url' maxlength='255' value='".escape($dashboard_url)."'>\n";
+		echo "<br />\n";
+		echo $text['description-dashboard_url'] ?? '';
+		echo "\n";
+		echo "</td>\n";
+		echo "</tr>\n";
+
+		echo "<tr class='type_icon' ".($dashboard_path != 'core/dashboard/resources/dashboard/icon.php' ? "class='type_icon' style='display: none;'" : null).">\n";
+		echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
+		echo $text['label-target']."\n";
+		echo "</td>\n";
+		echo "<td class='vtable' align='left'>\n";
+		echo "	<select name='dashboard_target' class='formfld'>\n";
+		echo "		<option value='self'>".$text['label-current_window_tab']."</option>\n";
+		echo "		<option value='new' ".(!empty($dashboard_target) && $dashboard_target == 'new' ? "selected='selected'" : null).">".$text['label-new_window_tab']."</option>\n";
+		echo "	</select>\n";
+		echo "<br />\n";
+		echo $text['description-dashboard_target']."\n";
+		echo "</td>\n";
+		echo "</tr>\n";
 	}
-	else {
-		echo "		<input type='text' class='formfld' name='dashboard_icon' value='".escape($dashboard_icon)."'>";
+
+	if (
+		$action == "add" ||
+		$dashboard_path == "core/dashboard/resources/dashboard/content.php"
+		) {
+		echo "<tr class='type_content' ".($dashboard_path != 'core/dashboard/resources/dashboard/content.php' ? "style='display: none;'" : null).">\n";
+		echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
+		echo "	".$text['label-content']."\n";
+		echo "</td>\n";
+		echo "<td class='vtable' align='left'>\n";
+		echo "	<textarea class='formfld' style='height: 100px;' name='dashboard_content'>".$dashboard_content."</textarea>\n";
+		echo "<br />\n";
+		echo $text['description-dashboard_content']."\n";
+		echo "</td>\n";
+		echo "</tr>\n";
+	}
+
+	if (
+		$action == "add" ||
+		$dashboard_path == "core/dashboard/resources/dashboard/content.php" ||
+		$dashboard_path == "core/dashboard/resources/dashboard/icon.php"
+		) {
+		echo "<tr class='type_icon type_content' ".($dashboard_path != 'core/dashboard/resources/dashboard/content.php' && $dashboard_path != 'core/dashboard/resources/dashboard/icon.php' ? "style='display: none;'" : null).">\n";
+		echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
+		echo "	".$text['label-details']."\n";
+		echo "</td>\n";
+		echo "<td class='vtable' align='left'>\n";
+		echo "	<textarea class='formfld' style='height: 100px;' name='dashboard_content_details'>".$dashboard_content_details."</textarea>\n";
+		echo "<br />\n";
+		echo $text['description-dashboard_content_details']."\n";
+		echo "</td>\n";
+		echo "</tr>\n";
 	}
-	echo "		</td>";
-	echo "	</tr>";
 
 	echo "<tr>\n";
 	echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
@@ -542,7 +628,9 @@
 	echo "</td>\n";
 	echo "</tr>\n";
 
-	if ($dashboard_path == "app/voicemails/resources/dashboard/voicemails.php" ||
+	if (
+		$action == "add" ||
+		$dashboard_path == "app/voicemails/resources/dashboard/voicemails.php" ||
 		$dashboard_path == "app/xml_cdr/resources/dashboard/missed_calls.php" ||
 		$dashboard_path == "app/xml_cdr/resources/dashboard/recent_calls.php" ||
 		$dashboard_path == "app/system/resources/dashboard/system_status.php" ||
@@ -553,25 +641,16 @@
 		$dashboard_path == "app/call_forward/resources/dashboard/call_forward.php" ||
 		$dashboard_path == "app/ring_groups/resources/dashboard/ring_group_forward.php" ||
 		$dashboard_path == "app/extensions/resources/dashboard/caller_id.php" ||
-		$dashboard_path == "app/maintenance/resources/dashboard/maintenance.php") {
-		echo "<tr>\n";
+		$dashboard_path == "app/maintenance/resources/dashboard/maintenance.php"
+		) {
+		echo "<tr class='type_chart' ".($action == "add" ? "style='display: none;'" : null).">\n";
 		echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
 		echo $text['label-dashboard_chart_type']."\n";
 		echo "</td>\n";
 		echo "<td class='vtable' style='position: relative;' align='left'>\n";
 		echo "	<select name='dashboard_chart_type' class='formfld'>\n";
-		if ($dashboard_chart_type == "doughnut") {
-			echo "		<option value='doughnut' selected='selected'>".$text['label-doughnut']."</option>\n";
-		}
-		else {
-			echo "		<option value='doughnut'>".$text['label-doughnut']."</option>\n";
-		}
-		if ($dashboard_chart_type == "number") {
-			echo "		<option value='number' selected='selected'>".$text['label-number']."</option>\n";
-		}
-		else {
-			echo "		<option value='number'>".$text['label-number']."</option>\n";
-		}
+		echo "		<option value='doughnut'>".$text['label-doughnut']."</option>\n";
+		echo "		<option value='number' ".(!empty($dashboard_chart_type) && $dashboard_chart_type == "number" ? "selected='selected'" : null).">".$text['label-number']."</option>\n";
 		echo "	</select>\n";
 		echo "<br />\n";
 		echo $text['description-dashboard_chart_type']."\n";
@@ -665,7 +744,7 @@
 	echo "<td class='vtable' style='position: relative;' align='left'>\n";
 	echo "	<select name='dashboard_column_span' class='formfld'>\n";
 	$i=1;
-	while ($i<=3) {
+	while ($i <= 3) {
 		$selected = ($i == $dashboard_column_span) ? "selected" : null;
 		echo "		<option value='$i' ".$selected.">$i</option>\n";
 		$i++;
@@ -683,7 +762,7 @@
 	echo "<td class='vtable' style='position: relative;' align='left'>\n";
 	echo "	<select name='dashboard_row_span' class='formfld'>\n";
 	$i=1;
-	while ($i<=3) {
+	while ($i <= 3) {
 		$selected = ($i == $dashboard_row_span) ? "selected" : null;
 		echo "		<option value='$i' ".$selected.">$i</option>\n";
 		$i++;
@@ -700,30 +779,10 @@
 	echo "</td>\n";
 	echo "<td class='vtable' style='position: relative;' align='left'>\n";
 	echo "	<select name='dashboard_details_state' class='formfld'>\n";
-	if ($dashboard_details_state == "expanded") {
-		echo "		<option value='expanded' selected='selected'>".$text['option-expanded']."</option>\n";
-	}
-	else {
-		echo "		<option value='expanded'>".$text['option-expanded']."</option>\n";
-	}
-	if ($dashboard_details_state == "contracted") {
-		echo "		<option value='contracted' selected='selected'>".$text['option-contracted']."</option>\n";
-	}
-	else {
-		echo "		<option value='contracted'>".$text['option-contracted']."</option>\n";
-	}
-	if ($dashboard_details_state == "hidden") {
-		echo "		<option value='hidden' selected='selected'>".$text['option-hidden']."</option>\n";
-	}
-	else {
-		echo "		<option value='hidden'>".$text['option-hidden']."</option>\n";
-	}
-	if ($dashboard_details_state == "disabled" || empty($dashboard_details_state)) {
-		echo "		<option value='disabled' selected='selected'>".$text['label-disabled']."</option>\n";
-	}
-	else {
-		echo "		<option value='disabled'>".$text['label-disabled']."</option>\n";
-	}
+	echo "		<option value='expanded'>".$text['option-expanded']."</option>\n";
+	echo "		<option value='contracted' ".($dashboard_details_state == "contracted" ? "selected='selected'" : null).">".$text['option-contracted']."</option>\n";
+	echo "		<option value='hidden' ".($dashboard_details_state == "hidden" ? "selected='selected'" : null).">".$text['option-hidden']."</option>\n";
+	echo "		<option value='disabled' ".($dashboard_details_state == "disabled" || empty($dashboard_details_state) ? "selected='selected'" : null).">".$text['label-disabled']."</option>\n";
 	echo "	</select>\n";
 	echo "<br />\n";
 	echo $text['description-dashboard_details_state']."\n";
@@ -799,4 +858,4 @@
 //include the footer
 	require_once "resources/footer.php";
 
-?>
+?>

+ 110 - 94
core/dashboard/index.php

@@ -59,7 +59,7 @@
 
 //build a list of groups the user is a member of to be used in a SQL in
 	if (is_array($_SESSION['user']['groups'])) {
-		foreach($_SESSION['user']['groups'] as $group) {
+		foreach ($_SESSION['user']['groups'] as $group) {
 			$group_uuids[] =  $group['group_uuid'];
 		}
 	}
@@ -68,32 +68,35 @@
 	}
 
 //get the list
-	$sql = "select \n";
-	$sql .= "dashboard_uuid, \n";
-	$sql .= "dashboard_name, \n";
-	$sql .= "dashboard_path, \n";
-	$sql .= "dashboard_url, \n";
-	$sql .= "dashboard_icon, \n";
-	$sql .= "dashboard_chart_type, \n";
-	$sql .= "dashboard_heading_text_color, \n";
-	$sql .= "dashboard_heading_background_color, \n";
-	$sql .= "dashboard_number_text_color, \n";
-	$sql .= "dashboard_background_color, \n";
-	$sql .= "dashboard_detail_background_color, \n";
-	$sql .= "dashboard_column_span, \n";
-	$sql .= "dashboard_row_span, \n";
-	$sql .= "dashboard_details_state, \n";
-	$sql .= "dashboard_order, \n";
-	$sql .= "cast(dashboard_enabled as text), \n";
-	$sql .= "dashboard_description \n";
-	$sql .= "from v_dashboard as d \n";
-	$sql .= "where dashboard_enabled = 'true' \n";
-	$sql .= "and dashboard_uuid in (\n";
-	$sql .= "	select dashboard_uuid from v_dashboard_groups where group_uuid in (\n";
-	$sql .= "		".$group_uuids_in." \n";
-	$sql .= "	)\n";
-	$sql .= ")\n";
-	$sql .= "order by dashboard_order asc \n";
+	$sql = "select ";
+	$sql .= "dashboard_uuid, ";
+	$sql .= "dashboard_name, ";
+	$sql .= "dashboard_path, ";
+	$sql .= "dashboard_icon, ";
+	$sql .= "dashboard_url, ";
+	$sql .= "dashboard_target, ";
+	$sql .= "dashboard_content, ";
+	$sql .= "dashboard_content_details, ";
+	$sql .= "dashboard_chart_type, ";
+	$sql .= "dashboard_heading_text_color, ";
+	$sql .= "dashboard_heading_background_color, ";
+	$sql .= "dashboard_number_text_color, ";
+	$sql .= "dashboard_background_color, ";
+	$sql .= "dashboard_detail_background_color, ";
+	$sql .= "dashboard_column_span, ";
+	$sql .= "dashboard_row_span, ";
+	$sql .= "dashboard_details_state, ";
+	$sql .= "dashboard_order, ";
+	$sql .= "cast(dashboard_enabled as text), ";
+	$sql .= "dashboard_description ";
+	$sql .= "from v_dashboard as d ";
+	$sql .= "where dashboard_enabled = 'true' ";
+	$sql .= "and dashboard_uuid in (";
+	$sql .= "	select dashboard_uuid from v_dashboard_groups where group_uuid in (";
+	$sql .= "		".$group_uuids_in." ";
+	$sql .= "	)";
+	$sql .= ")";
+	$sql .= "order by dashboard_order asc ";
 	$database = new database;
 	$dashboard = $database->select($sql, $parameters ?? null, 'all');
 	unset($sql, $parameters);
@@ -105,15 +108,17 @@
 			$widgets = explode(",", $_POST["widget_order"]);
 			$dashboard_order = '0';
 			$x = 0;
-			foreach($widgets as $widget) {
-				foreach($dashboard as $row) {
-					$dashboard_name = strtolower($row['dashboard_name']);
-					$dashboard_name = str_replace(" ", "_", $dashboard_name);
+			foreach ($widgets as $widget) {
+				foreach ($dashboard as $row) {
+					$dashboard_name = trim(preg_replace("/[^a-z]/", '_', strtolower($row['dashboard_name'])),'_');
 					if ($widget == $dashboard_name) {
 						$dashboard_order = $dashboard_order + 10;
 						$array['dashboard'][$x]['dashboard_name'] = $row['dashboard_name'];
-						$array['dashboard'][$x]['dashboard_url'] = $row['dashboard_url'];
 						$array['dashboard'][$x]['dashboard_icon'] = $row['dashboard_icon'];
+						$array['dashboard'][$x]['dashboard_url'] = $row['dashboard_url'];
+						$array['dashboard'][$x]['dashboard_content'] = $row['dashboard_content'];
+						$array['dashboard'][$x]['dashboard_content_details'] = $row['dashboard_content_details'];
+						$array['dashboard'][$x]['dashboard_target'] = $row['dashboard_target'];
 						$array['dashboard'][$x]['dashboard_uuid'] = $row['dashboard_uuid'];
 						$array['dashboard'][$x]['dashboard_order'] = $dashboard_order;
 						$x++;
@@ -236,59 +241,66 @@ div.hud_chart {
 
 /* Dashboard settings */
 <?php
-	foreach($dashboard as $row) {
-		$dashboard_name = str_replace(" ", "_", strtolower($row['dashboard_name']));
-		$background_color = json_decode($row['dashboard_background_color'], true);
+foreach ($dashboard as $row) {
+	$dashboard_name = trim(preg_replace("/[^a-z]/", '_', strtolower($row['dashboard_name'])),'_');
+	if (!empty($row['dashboard_background_color'])) {
+		$background_color =  json_decode($row['dashboard_background_color'], true);
+		echo "#".$dashboard_name." .hud_box .hud_content {\n";
+		echo "	background: ".$background_color[0].";\n";
+		echo "	background-image: linear-gradient(to right, ".$background_color[1]." 0%, ".$background_color[0]." 30%, ".$background_color[0]." 70%, ".$background_color[1]." 100%);\n";
+		echo "}\n";
+	}
+	if (!empty($row['dashboard_heading_text_color']) || !empty($row['dashboard_heading_background_color'])) {
+		echo "#".$dashboard_name." .hud_box .hud_title {\n";
+		if (!empty($row['dashboard_heading_text_color'])) { echo "	color: ".$row['dashboard_heading_text_color'].";\n"; }
+		if (!empty($row['dashboard_heading_background_color'])) { echo "	background-color: ".$row['dashboard_heading_background_color'].";\n"; }
+		echo "}\n";
+	}
+	if (!empty($row['dashboard_number_text_color'])) {
+		echo "#".$dashboard_name." .hud_box .hud_stat {\n";
+		echo "	color: ".$row['dashboard_number_text_color'].";\n";
+		echo "}\n";
+	}
+	if (!empty($row['dashboard_detail_background_color'])) {
 		$detail_background_color = json_decode($row['dashboard_detail_background_color'], true);
-		$dashboard_row_span = $row['dashboard_row_span'] ?? 2;
-		if (!isset($row['dashboard_row_span']) && in_array($dashboard_name, ["new_messages", "missed_calls", "recent_calls"])) {
-			$dashboard_row_span = 1;
-		}
-		echo "#".$dashboard_name." .hud_box .hud_content {";
-		echo "	background: ".$background_color[0].";";
-		echo "	background-image: linear-gradient(to right, ".$background_color[1]." 0%, ".$background_color[0]." 30%, ".$background_color[0]." 70%, ".$background_color[1]." 100%);";
-		echo "}";
-		echo "#".$dashboard_name." .hud_box .hud_title {";
-		echo "	color: ".$row['dashboard_heading_text_color'].";";
-		echo "	background-color: ".$row['dashboard_heading_background_color'].";";
-		echo "}";
-		echo "#".$dashboard_name." .hud_box .hud_stat {";
-		echo "	color: ".$row['dashboard_number_text_color'].";";
-		echo "}";
-		echo "#".$dashboard_name." .hud_box .hud_details {";
-		echo "	background: ".$detail_background_color[0].";";
-		echo "	background-image: linear-gradient(to right, ".$detail_background_color[1]." 0%, ".$detail_background_color[0]." 30%, ".$detail_background_color[0]." 70%, ".$detail_background_color[1]." 100%);";
-		echo "}";
-
-		switch ($dashboard_row_span) {
-			case 1:
-				echo "#".$dashboard_name." .hud_content {\n";
-				echo "	height: 89.5px;\n";
-				echo "}\n";
-				echo "#".$dashboard_name." .hud_stat {\n";
-				echo "	line-height: 0.1;\n";
-				echo "	font-size: 30pt;\n";
-				echo "}\n";
-				echo "#".$dashboard_name." .hud_chart {\n";
-				echo "	height: 50px;\n";
-				echo "}\n";
-				echo "#".$dashboard_name." div.hud_content .fas {\n";
-				echo "	line-height: 0.1;\n";
-				echo "	font-size: 30pt;\n";
-				echo "}\n";
-				break;
-			case 2:
-				echo "#".$dashboard_name." .hud_content {\n";
-				echo "	height: 195px;\n";
-				echo "}\n";
-				break;
-			case 3:
-				echo "#".$dashboard_name." .hud_content {\n";
-				echo "	height: 300.5px;\n";
-				echo "}\n";
-				break;
-		}
+		echo "#".$dashboard_name." .hud_box .hud_details {\n";
+		echo "	background: ".$detail_background_color[0].";\n";
+		echo "	background-image: linear-gradient(to right, ".$detail_background_color[1]." 0%, ".$detail_background_color[0]." 30%, ".$detail_background_color[0]." 70%, ".$detail_background_color[1]." 100%);\n";
+		echo "}\n";
 	}
+	$dashboard_row_span = $row['dashboard_row_span'] ?? 2;
+	if (!isset($row['dashboard_row_span']) && in_array($dashboard_name, ["new_messages", "missed_calls", "recent_calls"])) {
+		$dashboard_row_span = 1;
+	}
+	switch ($dashboard_row_span) {
+		case 1:
+			echo "#".$dashboard_name." .hud_content {\n";
+			echo "	height: 89.5px;\n";
+			echo "}\n";
+			echo "#".$dashboard_name." .hud_stat {\n";
+			echo "	line-height: 0.1;\n";
+			echo "	font-size: 30pt;\n";
+			echo "}\n";
+			echo "#".$dashboard_name." .hud_chart {\n";
+			echo "	height: 50px;\n";
+			echo "}\n";
+			echo "#".$dashboard_name." div.hud_content .fas {\n";
+			echo "	line-height: 0.1;\n";
+			echo "	font-size: 30pt;\n";
+			echo "}\n";
+			break;
+		case 2:
+			echo "#".$dashboard_name." .hud_content {\n";
+			echo "	height: 195px;\n";
+			echo "}\n";
+			break;
+		case 3:
+			echo "#".$dashboard_name." .hud_content {\n";
+			echo "	height: 300.5px;\n";
+			echo "}\n";
+			break;
+	}
+}
 ?>
 
 /* Screen smaller than 575px? 1 columns */
@@ -296,8 +308,8 @@ div.hud_chart {
   .widgets { grid-template-columns: repeat(1, minmax(100px, 1fr)); }
   .col-num { grid-column: span 1; }
 	<?php
-		foreach($dashboard as $row) {
-			$dashboard_name = str_replace(" ", "_", strtolower($row['dashboard_name']));
+		foreach ($dashboard as $row) {
+			$dashboard_name = trim(preg_replace("/[^a-z]/", '_', strtolower($row['dashboard_name'])),'_');
 			if (isset($dashboard_column_span) && is_numeric($dashboard_column_span)) {
 				echo "#".$dashboard_name." {\n";
 				echo "	grid-column: span 1;\n";
@@ -312,8 +324,8 @@ div.hud_chart {
   .widgets { grid-template-columns: repeat(2, minmax(100px, 1fr)); }
   .col-num { grid-column: span 2; }
 	<?php
-		foreach($dashboard as $row) {
-			$dashboard_name = str_replace(" ", "_", strtolower($row['dashboard_name']));
+		foreach ($dashboard as $row) {
+			$dashboard_name = trim(preg_replace("/[^a-z]/", '_', strtolower($row['dashboard_name'])),'_');
 			$dashboard_column_span = $row['dashboard_column_span'];
 			if (is_numeric($dashboard_column_span)) {
 				echo "#".$dashboard_name." {\n";
@@ -348,8 +360,8 @@ div.hud_chart {
   .widgets { grid-template-columns: repeat(3, minmax(100px, 1fr)); }
   .col-num { grid-column: span 2; }
 	<?php
-		foreach($dashboard as $row) {
-			$dashboard_name = str_replace(" ", "_", strtolower($row['dashboard_name']));
+		foreach ($dashboard as $row) {
+			$dashboard_name = trim(preg_replace("/[^a-z]/", '_', strtolower($row['dashboard_name'])),'_');
 			$dashboard_column_span = $row['dashboard_column_span'];
 			if (is_numeric($dashboard_column_span)) {
 				echo "#".$dashboard_name." {\n";
@@ -382,7 +394,8 @@ function toggle_grid_row_end(dashboard_name) {
 	if (state == 'expanded') {
 		widget.style.gridRowEnd = 'span ' + (Number(current_row_end.replace('span ', '')) - 3);
 		widget.dataset.state = "contracted";
-	} else {
+	}
+	else {
 		widget.style.gridRowEnd = 'span ' + (Number(current_row_end.replace('span ', '')) + 3);
 		widget.dataset.state = 'expanded';
 	}
@@ -394,10 +407,13 @@ function toggle_grid_row_end(dashboard_name) {
 //include the dashboards
 	echo "<div class='widgets' id='widgets' style='padding: 0 5px;'>\n";
 	$x = 0;
-	foreach($dashboard as $row) {
+	foreach ($dashboard as $row) {
 		$dashboard_name = $row['dashboard_name'];
 		$dashboard_icon = $row['dashboard_icon'] ?? '';
 		$dashboard_url  = $row['dashboard_url'] ?? '';
+		$dashboard_target  = $row['dashboard_target'] ?? '';
+		$dashboard_content  = $row['dashboard_content'] ?? '';
+		$dashboard_content_details  = $row['dashboard_content_details'] ?? '';
 		$dashboard_chart_type = $row['dashboard_chart_type'];
 		$dashboard_heading_text_color = $row['dashboard_heading_text_color'] ?? $settings->get('theme', 'dashboard_heading_text_color');
 		$dashboard_number_text_color = $row['dashboard_number_text_color'] ?? $settings->get('theme', 'dashboard_number_text_color');
@@ -413,8 +429,8 @@ function toggle_grid_row_end(dashboard_name) {
 			$dashboard_row_span = 1;
 		}
 
-		echo "<div class='widget' style='grid-row-end: span ".$dashboard_row_span.";' data-state='".$dashboard_details_state."' id='".str_replace(" ", "_", strtolower($dashboard_name))."' draggable='false'>\n";
-		include($row['dashboard_path']);
+		echo "<div class='widget' style='grid-row-end: span ".$dashboard_row_span.";' data-state='".$dashboard_details_state."' id='".trim(preg_replace("/[^a-z]/", '_', strtolower($dashboard_name)),'_')."' draggable='false'>\n";
+		include $row['dashboard_path'];
 		echo "</div>\n";
 		$x++;
 	}
@@ -519,4 +535,4 @@ function toggle_grid_row_end(dashboard_name) {
 //show the footer
 	require_once "resources/footer.php";
 
-?>
+?>

+ 26 - 0
core/dashboard/resources/dashboard/content.php

@@ -0,0 +1,26 @@
+<?php
+
+//includes files
+	require_once  dirname(__DIR__, 4) . "/resources/require.php";
+	require_once "resources/check_auth.php";
+
+//add multi-lingual support
+	$language = new text;
+	$text = $language->get($_SESSION['domain']['language']['code'], 'core/dashboard');
+
+//dashboard icon
+	echo "<div class='hud_box'>\n";
+
+	echo "<div class='hud_content' ".(empty($dashboard_details_state) || $dashboard_details_state != "disabled" ? "onclick=\"$('#hud_content_details').slideToggle('fast'); toggle_grid_row_end('".trim(preg_replace("/[^a-z]/", '_', strtolower($row['dashboard_name'])),'_')."');\"" : null).">\n";
+	echo "	<span class='hud_title'>".escape($dashboard_name)."</span>";
+	echo "	<span style='padding-left: 5%; padding-right: 5%; max-height: 150px; overflow: auto;'>".str_replace("\r", '<br>', escape($dashboard_content))."</span>\n";
+	echo "</div>\n";
+
+	if (empty($dashboard_details_state) || $dashboard_details_state != "disabled") {
+		echo "<div class='hud_details hud_box' id='hud_content_details' style='padding: 20px; 10%; overflow: auto;'>".str_replace("\r", '<br>', escape($dashboard_content_details))."</div>\n";
+	}
+
+	echo "<span class='hud_expander' onclick=\"$('#hud_content_details').slideToggle('fast');\"><span class='fas fa-ellipsis-h'></span></span>";
+	echo "</div>\n";
+
+?>

+ 5 - 14
core/dashboard/resources/dashboard/icon.php

@@ -11,25 +11,16 @@
 //dashboard icon
 	echo "<div class='hud_box'>\n";
 
-	echo "<div class='hud_content' ".($row['dashboard_details_state'] == "disabled" ?: "onclick=\"$('#hud_icon_details').slideToggle('fast');\"").">\n";
-	echo "	<span class='hud_title' onclick=\"document.location.href='".$dashboard_url."'\">".$dashboard_name."</span>"; // (isset($text['label-'.$dashboard_name])) ? $text['label-'.$dashboard_name] : $dashboard_name
-	echo "	<a href='".$dashboard_url."'><span class='hud_stat'><i class=\"fas ".$dashboard_icon."\" style=\"font-size: 0.8em;\"></i></span></a>\n";
+	echo "<div class='hud_content' ".(empty($dashboard_details_state) || $dashboard_details_state != "disabled" ? "onclick=\"$('#hud_icon_details').slideToggle('fast'); toggle_grid_row_end('".trim(preg_replace("/[^a-z]/", '_', strtolower($row['dashboard_name'])),'_')."');\"" : null).">\n";
+	echo "	<span class='hud_title' onclick=\"window.open('".$dashboard_url."', '".($dashboard_target == 'new' ? '_blank' : '_self')."')\">".escape($dashboard_name)."</span>";
+	echo "	<a href='".$dashboard_url."' ".($dashboard_target == 'new' ? "target='_blank'" : null)."><span class='hud_stat'><i class=\"fas ".$dashboard_icon."\" style=\"font-size: 0.8em;\"></i></span></a>\n";
 	echo "</div>\n";
 
 	if (empty($dashboard_details_state) || $dashboard_details_state != "disabled") {
-		echo "<div class='hud_details hud_box' id='hud_icon_details'>";
-		echo "<table class='tr_hover' width='100%' cellpadding='0' cellspacing='0' border='0'>\n";
-		echo "<tr>\n";
-		echo "<td>\n";
-		echo "	&nbsp;\n";
-		echo "</td>\n";
-		echo "</table>\n";
-		//echo "<span style='display: block; margin: 6px 0 7px 0;'><a href='".PROJECT_PATH."/app/xml_cdr/xml_cdr.php?status=missed'>".$text['label-view_all']."</a></span>\n";
-		echo "</div>";
-		//$n++;
+		echo "<div class='hud_details hud_box' id='hud_icon_details' style='padding: 20px; 10%; overflow: auto;'>".str_replace("\r", '<br>', escape($dashboard_content_details))."</div>\n";
 	}
 
 	echo "<span class='hud_expander' onclick=\"$('#hud_icon_details').slideToggle('fast');\"><span class='fas fa-ellipsis-h'></span></span>";
 	echo "</div>\n";
 
-?>
+?>

+ 128 - 0
resources/app_languages.php

@@ -5481,6 +5481,83 @@ $text['label-link']['zh-cn'] = "链接";
 $text['label-link']['ja-jp'] = "リンク";
 $text['label-link']['ko-kr'] = "링크";
 
+$text['label-target']['en-us'] = "Target";
+$text['label-target']['en-gb'] = "Target";
+$text['label-target']['ar-eg'] = "هدف";
+$text['label-target']['de-at'] = "Ziel";
+$text['label-target']['de-ch'] = "Ziel";
+$text['label-target']['de-de'] = "Ziel";
+$text['label-target']['el-gr'] = "Στόχος";
+$text['label-target']['es-cl'] = "Objetivo";
+$text['label-target']['es-mx'] = "Objetivo";
+$text['label-target']['fr-ca'] = "Cible";
+$text['label-target']['fr-fr'] = "Cible";
+$text['label-target']['he-il'] = "יַעַד";
+$text['label-target']['it-it'] = "Bersaglio";
+$text['label-target']['nl-nl'] = "Doel";
+$text['label-target']['pl-pl'] = "Cel";
+$text['label-target']['pt-br'] = "Alvo";
+$text['label-target']['pt-pt'] = "Alvo";
+$text['label-target']['ro-ro'] = "Ţintă";
+$text['label-target']['ru-ru'] = "Цель";
+$text['label-target']['sv-se'] = "Mål";
+$text['label-target']['uk-ua'] = "Цільова";
+$text['label-target']['zh-cn'] = "目标";
+$text['label-target']['ja-jp'] = "目標";
+$text['label-target']['ko-kr'] = "표적";
+
+$text['label-current_window_tab']['en-us'] = "Current Window/Tab";
+$text['label-current_window_tab']['en-gb'] = "Current Window/Tab";
+$text['label-current_window_tab']['ar-eg'] = "النافذة أو علامة التبويب الحالية";
+$text['label-current_window_tab']['de-at'] = "Aktuelles Fenster oder Tab";
+$text['label-current_window_tab']['de-ch'] = "Aktuelles Fenster oder Tab";
+$text['label-current_window_tab']['de-de'] = "Aktuelles Fenster oder Tab";
+$text['label-current_window_tab']['el-gr'] = "Τρέχον παράθυρο ή καρτέλα";
+$text['label-current_window_tab']['es-cl'] = "Ventana o pestaña actual";
+$text['label-current_window_tab']['es-mx'] = "Ventana o pestaña actual";
+$text['label-current_window_tab']['fr-ca'] = "Fenêtre ou onglet actuel";
+$text['label-current_window_tab']['fr-fr'] = "Fenêtre ou onglet actuel";
+$text['label-current_window_tab']['he-il'] = "חלון או כרטיסייה נוכחיים";
+$text['label-current_window_tab']['it-it'] = "Finestra o scheda corrente";
+$text['label-current_window_tab']['nl-nl'] = "Huidig ​​venster of tabblad";
+$text['label-current_window_tab']['pl-pl'] = "Bieżące okno lub karta";
+$text['label-current_window_tab']['pt-br'] = "Janela ou guia atual";
+$text['label-current_window_tab']['pt-pt'] = "Janela ou guia atual";
+$text['label-current_window_tab']['ro-ro'] = "Fereastra sau fila curentă";
+$text['label-current_window_tab']['ru-ru'] = "Текущее окно или вкладка";
+$text['label-current_window_tab']['sv-se'] = "Aktuellt fönster eller flik";
+$text['label-current_window_tab']['uk-ua'] = "Поточне вікно або вкладка";
+$text['label-current_window_tab']['tr-tr'] = "Geçerli Pencere veya Sekme";
+$text['label-current_window_tab']['zh-cn'] = "当前窗口或选项卡";
+$text['label-current_window_tab']['ja-jp'] = "現在のウィンドウまたはタブ";
+$text['label-current_window_tab']['ko-kr'] = "현재 창 또는 탭";
+
+$text['label-new_window_tab']['en-us'] = "New Window/Tab";
+$text['label-new_window_tab']['en-gb'] = "New Window/Tab";
+$text['label-new_window_tab']['ar-eg'] = "نافذة أو علامة تبويب جديدة";
+$text['label-new_window_tab']['de-at'] = "Neues Fenster oder neuer Tab";
+$text['label-new_window_tab']['de-ch'] = "Neues Fenster oder neuer Tab";
+$text['label-new_window_tab']['de-de'] = "Neues Fenster oder neuer Tab";
+$text['label-new_window_tab']['el-gr'] = "Νέο παράθυρο ή καρτέλα";
+$text['label-new_window_tab']['es-cl'] = "Nueva ventana o pestaña";
+$text['label-new_window_tab']['es-mx'] = "Nueva ventana o pestaña";
+$text['label-new_window_tab']['fr-ca'] = "Nouvelle fenêtre ou onglet";
+$text['label-new_window_tab']['fr-fr'] = "Nouvelle fenêtre ou onglet";
+$text['label-new_window_tab']['he-il'] = "חלון חדש או כרטיסייה";
+$text['label-new_window_tab']['it-it'] = "Nuova finestra o scheda";
+$text['label-new_window_tab']['nl-nl'] = "Nieuw venster of tabblad";
+$text['label-new_window_tab']['pl-pl'] = "Nowe okno lub karta";
+$text['label-new_window_tab']['pt-br'] = "Nova janela ou guia";
+$text['label-new_window_tab']['pt-pt'] = "Nova janela ou guia";
+$text['label-new_window_tab']['ro-ro'] = "Fereastră sau filă nouă";
+$text['label-new_window_tab']['ru-ru'] = "Новое окно или вкладка";
+$text['label-new_window_tab']['sv-se'] = "Nytt fönster eller flik";
+$text['label-new_window_tab']['uk-ua'] = "Нове вікно або вкладка";
+$text['label-new_window_tab']['tr-tr'] = "Yeni Pencere veya Sekme";
+$text['label-new_window_tab']['zh-cn'] = "新窗口或标签页";
+$text['label-new_window_tab']['ja-jp'] = "新しいウィンドウまたはタブ";
+$text['label-new_window_tab']['ko-kr'] = "새 창 또는 탭";
+
 $text['label-icon']['en-us'] = "Icon";
 $text['label-icon']['en-gb'] = "Icon";
 $text['label-icon']['ar-eg'] = "أيقونة";
@@ -6384,4 +6461,55 @@ $text['button-hide']['zh-cn'] = "隐藏";
 $text['button-hide']['ja-jp'] = "隠れる";
 $text['button-hide']['ko-kr'] = "숨다";
 
+$text['label-content']['en-us'] = 'Content';
+$text['label-content']['en-gb'] = 'Content';
+$text['label-content']['ar-eg'] = 'محتوى';
+$text['label-content']['de-at'] = 'Inhalt';
+$text['label-content']['de-ch'] = 'Inhalt';
+$text['label-content']['de-de'] = 'Inhalt';
+$text['label-content']['el-gr'] = 'Περιεχόμενο';
+$text['label-content']['es-cl'] = 'Contenido';
+$text['label-content']['es-mx'] = 'Contenido';
+$text['label-content']['fr-ca'] = 'Contenu';
+$text['label-content']['fr-fr'] = 'Contenu';
+$text['label-content']['he-il'] = 'תוֹכֶן';
+$text['label-content']['it-it'] = 'Contenuto';
+$text['label-content']['nl-nl'] = 'Inhoud';
+$text['label-content']['pl-pl'] = 'Treść';
+$text['label-content']['pt-br'] = 'Contente';
+$text['label-content']['pt-pt'] = 'Contente';
+$text['label-content']['ro-ro'] = 'Conţinut';
+$text['label-content']['ru-ru'] = 'Содержание';
+$text['label-content']['sv-se'] = 'Innehåll';
+$text['label-content']['uk-ua'] = 'Зміст';
+$text['label-content']['tr-tr'] = 'İçerik';
+$text['label-content']['zh-cn'] = '内容';
+$text['label-content']['ja-jp'] = 'コンテンツ';
+$text['label-content']['ko-kr'] = '콘텐츠';
+
+$text['label-details']['en-us'] = "Details";
+$text['label-details']['en-gb'] = "Details";
+$text['label-details']['ar-eg'] = "تفاصيل";
+$text['label-details']['de-at'] = "Details";
+$text['label-details']['de-ch'] = "Details";
+$text['label-details']['de-de'] = "Details";
+$text['label-details']['el-gr'] = "Λεπτομέριες";
+$text['label-details']['es-cl'] = "Detalles";
+$text['label-details']['es-mx'] = "Detalles";
+$text['label-details']['fr-ca'] = "Détails";
+$text['label-details']['fr-fr'] = "Détails";
+$text['label-details']['he-il'] = "פרטים";
+$text['label-details']['it-it'] = "Dettagli";
+$text['label-details']['nl-nl'] = "Details";
+$text['label-details']['pl-pl'] = "Szczegóły";
+$text['label-details']['pt-br'] = "Detalhes";
+$text['label-details']['pt-pt'] = "Detalhes";
+$text['label-details']['ro-ro'] = "Detalii";
+$text['label-details']['ru-ru'] = "Детали";
+$text['label-details']['sv-se'] = "Detaljer";
+$text['label-details']['uk-ua'] = "Деталі";
+$text['label-details']['zh-cn'] = "详细情况";
+$text['label-details']['ja-jp'] = "インフォメーション";
+$text['label-details']['ko-kr'] = "제품 정보";
+
 ?>