אלמנטי דשבורד — מונים, גרפים, טקסט וטאבים
ארבעה כלים מציבים תוכן על דף: כותרת או פסקה, מונה KPI, גרף, ורצועת לשוניות. כולם עובדים באותה תבנית — מוסיפים כשמעבירים מיקום, עורכים כשמעבירים elemId.
המיקום — שלוש דרכים, אותן שלוש בכל הכלים
Section titled “המיקום — שלוש דרכים, אותן שלוש בכל הכלים”| הפרמטרים | מתי | ההערה |
|---|---|---|
rowId + columnNumber |
הוספה לשורה קיימת | columnNumber הוא 0‑based. ב‑RTL עמודה 0 היא הימנית |
intoExistingElemId |
הוספה לתוך אלמנט קיים — בדרך כלל מיכל | לא אלמנט עם המחלקה rDivider. למיכל: ה‑innerContainerId שחזר מ‑Add-Container-to-Page, לא ה‑newContainerId |
elemId |
עריכת אלמנט קיים | rowId שנשלח איתו מתעלמים ממנו — elemId גובר |
התשובה של שלושת הכלים הראשונים: { "response": { "success": true, "msg": "counter element with id P289 added" } } — ה‑msg הוא המקום היחיד שבו חוזר מזהה האלמנט החדש. שמרו אותו. Add-Edit-Tabs-Element מחזיר success בלבד, ואת מזהה הלשוניות קוראים מהדף.
Add-Edit-Text-Element
Section titled “Add-Edit-Text-Element”כותרת או פסקה.
| הפרמטר | טיפוס | חובה | המשמעות |
|---|---|---|---|
pageId |
String | ✔ | הדף. אין פרמטר pageName — המזהה בלבד |
elemType |
Enum | ✔ | H1 · H2 · H3 · H4 · P |
html |
String | ✔ | התוכן. HTML מוטבע מותר |
rowId + columnNumber |
String + Number | להוספה | מיקום |
intoExistingElemId |
String | להוספה | חלופה למיקום |
elemId |
String | לעריכה | האלמנט הקיים |
siteId |
String | האתר |
{ "pageId": "<id>", "elemType": "H2", "html": "<font color=\"#3249b3\" style=\"font-size: 24px;\">פרטי התקשרות</font>", "rowId": "P280", "columnNumber": 0 }בעריכה, elemType חייב להתאים לסוג הקיים. שינוי P ל‑H2 אינו פעולת עריכה — הוא דורש הסרה והוספה מחדש.
מוסכמות טיפוגרפיה של הדשבורדים המקוריים: כותרת סקשן H2 בכחול #3249b3 בגודל 24; כותרת גרף כ‑P עם border-bottom:1px solid #b5b5b5; כיתוב הסבר בגודל 12 בצבע #b5b5b5.
Add-Edit-Counter-Element
Section titled “Add-Edit-Counter-Element”מונה KPI — מספר בודד גדול שמחושב משאילתה.
| הפרמטר | טיפוס | חובה | המשמעות |
|---|---|---|---|
pageId |
String | ✔ | הדף |
counterFunction |
Enum | ✔ | sum-count · sum · avg · min · max |
counterField |
String | לכל פונקציה מלבד sum-count |
השדה המספרי לחישוב. הכלי לא אוכף — avg בלי שדה מתקבל ומציג ריק |
tableName |
String | ✔ (גם בעריכה) | הטבלה שעליה שואלים |
criteria |
Array<Object> | תנאי סינון — ראו למטה | |
format |
String | פורמט מספר בתחביר Numeral.js, למשל 0,0 או 0,0.00 |
|
css |
String | סגנון inline על אלמנט המונה | |
queryForm |
String | שם טופס בדף שערכיו יסננו את התוצאה | |
rowId+columnNumber / intoExistingElemId / elemId |
מיקום או עריכה | ||
siteId |
String | האתר |
פונקציות החישוב
Section titled “פונקציות החישוב”counterFunction |
מה מחושב | counterField |
|---|---|---|
sum-count |
ספירת רשומות שעונות לתנאי | לא נדרש |
sum |
סכום ערכי שדה | נדרש |
avg |
ממוצע | נדרש |
min / max |
הערך הנמוך / הגבוה | נדרש |
sum-count הוא ברירת המחדל המנטלית — “כמה פניות פתוחות”. השאר דורשים שדה Number; שדה מסוג אחר יחזיר 0 בלי שגיאה.
format — פורמט המספר
Section titled “format — פורמט המספר”הפורמט הוא של ספריית Numeral.js, לא של Intl ולא של פורמט התאריכים של המערכת:
| הפורמט | התוצאה |
|---|---|
0,0 |
1,250 — פסיק לאלפים, בלי עשרוניות |
0,0.00 |
1,250.00 |
0% |
85% |
0,0 a |
קיצור לכמויות גדולות — 1890 מוצג 2 k |
לסכומי כסף 0,0 הוא כמעט תמיד הנכון: מונה שמציג 1250000 נקרא שגוי בשבריר שנייה, ומונה שמציג 1,250,000 נקרא נכון.
{ "pageId": "<id>", "elemId": "P33", "tableName": "Sales", "counterFunction": "sum", "counterField": "Total", "format": "0,0", "criteria": [] }Add-Edit-Chart-Element
Section titled “Add-Edit-Chart-Element”גרף Chart.js — גרסה 2.9.4 (chart.min.2.9.4.js + chartjs-plugin-datalabels). זה קובע את התחביר של chartOptions ו‑chartDataset.
| הפרמטר | טיפוס | חובה | המשמעות |
|---|---|---|---|
pageId |
String | ✔ | הדף |
chartType |
Enum | ✔ | Bar · Line · Pie · Doughnut |
chartTheme |
Enum | ✔ | ערכת צבעים — ראו הרשימה |
tableName |
String | ✔ (גם בעריכה) | הטבלה |
chartLabel |
String | ציר ה‑X / הקיבוץ. מסלול Pointer: FieldId.TargetClass.FieldName |
|
chartLabelFormat |
Enum | כש‑chartLabel הוא תאריך |
dow · q · q/yy · mm · mm/yy · yy · dd/mm/yy · mm/dd/yy |
chartLabelSort |
Enum | ascending · descending |
|
chartCategory |
String | ממד שני — פיצול לסדרות. רק ב‑Bar ו‑Line |
|
chartCategoryFormat |
Enum | כש‑chartCategory הוא תאריך |
אותו enum |
chartFunc |
Enum | sum-count · sum · avg · min · max |
|
chartValue |
String | כש‑chartFunc אינו sum-count |
השדה המספרי |
chartDataset |
String (JSON) | עקיפה גולמית בפורמט dataset של Chart.js 2 — כמחרוזת, ראו למטה | |
chartOptions |
String (JSON) | עקיפה גולמית בפורמט options של Chart.js 2 — כמחרוזת, ראו למטה | |
criteria / queryForm |
כמו במונה | ||
rowId+columnNumber / intoExistingElemId / elemId |
מיקום או עריכה | ||
siteId |
String | האתר |
ערכות הנושא
Section titled “ערכות הנושא”ה‑enum מכיל ארבע‑עשרה:
icecream · rainyday · bluesky · grasshopper · partytime · simbla · romantic · heatwave · blooming · sunnysummer · underthesea · coldmountain · oldtown · daydream
chartTheme הוא פרמטר חובה — אין ברירת מחדל. בחרו אחת ודבקו בה בכל הגרפים באותו דף; דשבורד שכל גרף בו בערכה אחרת נראה שבור גם כשהנתונים מושלמים.
תווית מול קטגוריה
Section titled “תווית מול קטגוריה”זה ההבדל שקובע איך הגרף ייראה:
chartLabel— לפי מה מקבצים. זה ציר ה‑X בגרף עמודות, ואלה הפרוסות בעוגה.chartCategory— ממד שני, שמפצל כל עמודה לכמה סדרות. קיים רק ב‑Barו‑Line.
“מכירות לפי חודש” = chartLabel: "createdAt" עם chartLabelFormat: "mm/yy".
“מכירות לפי חודש, מפוצל לפי אחראי” = אותו דבר, ועוד chartCategory: "OwnerId._User.name".
{ "pageId": "<id>", "elemId": "P52", "tableName": "Sales", "chartType": "Bar", "chartTheme": "bluesky", "chartLabel": "createdAt", "chartLabelFormat": "mm/yy", "chartLabelSort": "ascending", "chartCategory": "SaleStatusId.SaleStatuses.Name", "chartFunc": "sum", "chartValue": "Total", "criteria": [] }עקיפות Chart.js גולמיות
Section titled “עקיפות Chart.js גולמיות”chartDataset ו‑chartOptions נכתבים למאפייני data-chart-options / data-chart-dataset של האלמנט ומועברים לספרייה. זו הדרך היחידה לשלוט בכל מה שהערכות לא נותנות.
{ "pageId": "<id>", "elemId": "P52", "tableName": "Sales", "chartType": "Bar", "chartTheme": "bluesky", "chartOptions": "{\"legend\":{\"position\":\"bottom\",\"labels\":{\"fontColor\":\"#252C57\",\"fontSize\":13}},\"scales\":{\"yAxes\":[{\"ticks\":{\"beginAtZero\":true,\"fontColor\":\"#252C57\"}}],\"xAxes\":[{\"barPercentage\":0.3}]}}" }legend.position: "bottom" בתחביר הזה מופיע ברינדור.
Add-Edit-Tabs-Element
Section titled “Add-Edit-Tabs-Element”רצועת לשוניות.
| הפרמטר | טיפוס | חובה | המשמעות |
|---|---|---|---|
pageId |
String | ✔ | הדף |
newTabs |
Array<{label}> | להוספה | הלשוניות. לפחות אחת ביצירת אלמנט חדש |
elemId |
String | לעריכה | אלמנט הלשוניות הקיים |
updateTabs |
Array<{id,label}> | שינוי כותרת ללשוניות קיימות | |
deleteTabs |
Array<String> | מזהי לשוניות למחיקה | |
rowId + columnNumber / intoExistingElemId |
להוספה | מיקום | |
siteId |
String | האתר |
// יצירה{ "pageId": "<id>", "rowId": "P300", "columnNumber": 0, "newTabs": [ { "label": "פרטים" }, { "label": "מסמכים" }, { "label": "היסטוריה" } ] }
// עריכה — שינוי אחת, מחיקת אחרת, הוספת שלישית{ "pageId": "<id>", "elemId": "P312", "updateTabs": [ { "id": "<tabId>", "label": "פרטי ההתקשרות" } ], "deleteTabs": [ "<tabId2>" ], "newTabs": [ { "label": "חיובים" } ] }הסינון — criteria
Section titled “הסינון — criteria”שלושת הכלים המבוססים על שאילתה (מונה, גרף, ובעקיפין טבלת תצוגה) מקבלים את מבנה התנאי B — אותו מבנה של הטריגרים:
| המפתח | חובה | המשמעות |
|---|---|---|
F |
✔ | שם השדה. מסלול Pointer: OwnerId._User.name |
C |
✔ | האופרטור |
T |
✔ | טיפוס הערך — String · Number · Pointer · Boolean · Date |
V |
✔ | הערך |
P |
ל‑Pointer | { targetClass ✔, visibleVal, multiple } |
FText |
תווית לתצוגה |
האופרטורים ב‑enum של שני הכלים האלה — עשרה:
contains · startsWith · equalTo · greaterThan · lessThan · greaterThanOrEqualTo · lessThanOrEqualTo · notEqualTo · containedIn · notContainedIn
שני ערכי V מיוחדים
Section titled “שני ערכי V מיוחדים”"currentUser"— ב‑Pointer ל‑_User. כך בונים “המכירות שלי” בלי לקבע מזהה משתמש."formName:fieldName"— קורא את הערך מתוך שדה בטופס שעל הדף, בזמן השאילתה. זה המנגנון שמאחורי מסנני התאריך של הדשבורדים: המשתמש בוחר טווח ולוחץ “הפעל”, והמונים והגרפים נשאלים מחדש.
"criteria": [ { "F": "createdAt", "C": "greaterThanOrEqualTo", "T": "Date", "V": "genericform:FromDate" }, { "F": "createdAt", "C": "lessThanOrEqualTo", "T": "Date", "V": "genericform:ToDate" }, { "F": "OwnerId", "C": "equalTo", "T": "Pointer", "V": "currentUser", "P": { "targetClass": "_User" } }]שתי ההתנהגויות שמפתיעות
Section titled “שתי ההתנהגויות שמפתיעות”1. אלמנט בתוך דף כרטיס מסונן אוטומטית לרשומה הפתוחה
Section titled “1. אלמנט בתוך דף כרטיס מסונן אוטומטית לרשומה הפתוחה”תיאור הכלי אומר את זה במפורש: אם המונה או הגרף יושבים בתוך טופס, והטבלה שהם שואלים עליה מחזיקה שדה Pointer למחלקה של הטופס — הנתונים מסוננים אוטומטית לרשומה הנוכחית, בלי שום criteria. הדוגמה מהתיאור: מונה על Sales בתוך הכרטיס של Accounts מסונן לבד לפי AccountId של הלקוח הפתוח. כך באמת עובדים המונים והטבלאות של הכרטיסים המובנים.
ושתי הסתייגויות: הסינון האוטומטי עובד רק כשקיים שדה Pointer מתאים בסכימה; וסינון ידני שתוסיפו ב‑criteria אמור להצטרף לסינון האוטומטי, לא להחליף אותו.
2. כל עריכת דף דורשת רענון בדפדפן
Section titled “2. כל עריכת דף דורשת רענון בדפדפן”השינוי נשמר בשרת מיד, ולא מופיע במסך פתוח. כל ארבעת הכלים מסיימים באותה המלצה: “suggest the user to reload the page to see the changes”.
- שינוי אלמנט → רענון רגיל.
- שינוי
jsFile/cssFile→ רענון קשיח (Ctrl+F5), כי הקובץ נמצא במטמון.
זה נשמע טריוויאלי, והוא הגורם מספר 1 ל“הכלי אמר שהצליח אבל לא רואים כלום” — ולתיקון חוזר של משהו שכבר תוקן.
כשהאלמנט לא מציג מה שציפיתם
Section titled “כשהאלמנט לא מציג מה שציפיתם”| התסמין | הסיבה הסבירה |
|---|---|
| מונה מציג 0 כשיש נתונים | תנאי שמפנה לשדה טופס שאינו קיים בדף (מציג 0, לא שגיאה) · counterField שגוי או לא מספרי (max על String → 0) · תנאים מגבילים מדי |
| מונה ריק לגמרי | avg/sum בלי counterField |
| גרף עם צירים ובלי עמודות | חוסר התאמה בתנאים · chartValue ריק ברשומות |
| גרף ריק (canvas בלי ציור) ו‑HTTP 400 ברשת | chartLabel/chartCategory עוברים דרך טבלת lookup שאין עליה הרשאת find — טבלה מ‑newTableName נולדת כך (מגבלה ידועה) · chartOptions שנשלח כאובייקט ([object Object]) |
| המונה בכרטיס מציג את כל המערכת | בגרסאות שרת ישנות הסינון האוטומטי לא פעל על אלמנטי MCP — ראו הערת ההיסטוריה; בשרת עדכני — בדקו שקיים שדה Pointer מתאים בסכימה |
| עמודה אחת ענקית | chartLabel הוא טקסט חופשי — החליפו לשדה קטגוריה |
| פרוסה בשם “Unknown” בעוגה | תוויות null — סננו אותן החוצה בתנאי |
| שני גרפים במשבצת אחת | הוספתם במקום לערוך — חסר elemId |
| הכול ריק אצל משתמש מסוים ותקין אצלכם | CLP — למשתמש אין find על הטבלה. בדקו ב‑הרשאות |
| השינוי לא נראה בכלל | הדף לא רוענן |
- עריכת דפים ואלמנטים — לפתוח שורה ולייצר מיכל
- אתרים ודפים — קריאה — למצוא את
rowIdואתelemId - טבלאות תצוגה ודפי רשימה — האלמנט החמישי בדשבורד
- דוחות — כשהמספר צריך להיות טבלה ולא מונה
- תפריטים — להוסיף את הדשבורד לתפריט
- אינדקס הכלים המלא