1
<?php
2
defined('ABSPATH') || exit;
3
require_once __DIR__ . '/elementor-widget-base.php';
4
if (!class_exists('FRESH_OO_Status_Badge_Widget') && class_exists('FRESH_OO_Widget_Base')) {
5
class FRESH_OO_Status_Badge_Widget extends FRESH_OO_Widget_Base {
6
public function get_name(): string { return 'fresh-oo-status-badge'; }
7
public function get_title(): string { return 'onOffice Status-Badge'; }
8
public function get_icon(): string { return 'eicon-alert'; }
9
public function get_keywords(): array { return ['onoffice','status','badge','reserviert','verkauft','akquise']; }
10
11
protected function register_controls(): void {
12
$this->start_controls_section('content',['label'=>'Status']);
13
$this->add_control('source',['label'=>'Statusfeld','type'=>\Elementor\Controls_Manager::SELECT,'default'=>'auto','options'=>['auto'=>'Automatisch (status2 → status)','oo_status2'=>'oo_status2','oo_status'=>'oo_status']]);
14
$this->add_control('prefix',['label'=>'Präfix','type'=>\Elementor\Controls_Manager::TEXT,'placeholder'=>'Status:']);
15
$this->add_control('show_icon',['label'=>'Icon anzeigen','type'=>\Elementor\Controls_Manager::SWITCHER,'default'=>'']);
16
$this->add_control('icon',['label'=>'Icon','type'=>\Elementor\Controls_Manager::ICONS,'default'=>['value'=>'fas fa-circle','library'=>'fa-solid'],'condition'=>['show_icon'=>'yes']]);
17
$this->end_controls_section();
18
19
$this->start_controls_section('colors',['label'=>'Statusfarben','tab'=>\Elementor\Controls_Manager::TAB_STYLE]);
20
$this->add_control('active_bg',['label'=>'Aktive Vermarktung · Hintergrund','type'=>\Elementor\Controls_Manager::COLOR,'default'=>'#DFF3E7','selectors'=>['{{WRAPPER}} .fresh-oo-status-badge[data-status-group="active"]'=>'background-color:{{VALUE}};']]);
21
$this->add_control('active_color',['label'=>'Aktive Vermarktung · Text','type'=>\Elementor\Controls_Manager::COLOR,'default'=>'#17633A','selectors'=>['{{WRAPPER}} .fresh-oo-status-badge[data-status-group="active"]'=>'color:{{VALUE}};']]);
22
$this->add_control('acquisition_bg',['label'=>'In Akquise · Hintergrund','type'=>\Elementor\Controls_Manager::COLOR,'default'=>'#EEEAFB','selectors'=>['{{WRAPPER}} .fresh-oo-status-badge[data-status-group="acquisition"]'=>'background-color:{{VALUE}};']]);
23
$this->add_control('acquisition_color',['label'=>'In Akquise · Text','type'=>\Elementor\Controls_Manager::COLOR,'default'=>'#51408C','selectors'=>['{{WRAPPER}} .fresh-oo-status-badge[data-status-group="acquisition"]'=>'color:{{VALUE}};']]);
24
$this->add_control('reserved_bg',['label'=>'Reserviert · Hintergrund','type'=>\Elementor\Controls_Manager::COLOR,'default'=>'#FFF1CC','selectors'=>['{{WRAPPER}} .fresh-oo-status-badge[data-status-group="reserved"]'=>'background-color:{{VALUE}};']]);
25
$this->add_control('reserved_color',['label'=>'Reserviert · Text','type'=>\Elementor\Controls_Manager::COLOR,'default'=>'#7A5600','selectors'=>['{{WRAPPER}} .fresh-oo-status-badge[data-status-group="reserved"]'=>'color:{{VALUE}};']]);
26
$this->add_control('sold_bg',['label'=>'Verkauft / Vermietet · Hintergrund','type'=>\Elementor\Controls_Manager::COLOR,'default'=>'#F2E1E1','selectors'=>['{{WRAPPER}} .fresh-oo-status-badge[data-status-group="sold"]'=>'background-color:{{VALUE}};']]);
27
$this->add_control('sold_color',['label'=>'Verkauft / Vermietet · Text','type'=>\Elementor\Controls_Manager::COLOR,'default'=>'#7C2929','selectors'=>['{{WRAPPER}} .fresh-oo-status-badge[data-status-group="sold"]'=>'color:{{VALUE}};']]);
28
$this->add_control('other_bg',['label'=>'Sonstige · Hintergrund','type'=>\Elementor\Controls_Manager::COLOR,'default'=>'#EFEFEF','selectors'=>['{{WRAPPER}} .fresh-oo-status-badge[data-status-group="other"]'=>'background-color:{{VALUE}};']]);
29
$this->add_control('other_color',['label'=>'Sonstige · Text','type'=>\Elementor\Controls_Manager::COLOR,'default'=>'#333333','selectors'=>['{{WRAPPER}} .fresh-oo-status-badge[data-status-group="other"]'=>'color:{{VALUE}};']]);
30
$this->end_controls_section();
31
32
$this->start_controls_section('style',['label'=>'Badge','tab'=>\Elementor\Controls_Manager::TAB_STYLE]);
33
$this->add_responsive_control('align',['label'=>'Ausrichtung','type'=>\Elementor\Controls_Manager::CHOOSE,'options'=>['left'=>['title'=>'Links','icon'=>'eicon-text-align-left'],'center'=>['title'=>'Mitte','icon'=>'eicon-text-align-center'],'right'=>['title'=>'Rechts','icon'=>'eicon-text-align-right']],'default'=>'left','selectors'=>['{{WRAPPER}} .elementor-widget-container'=>'text-align:{{VALUE}};']]);
34
$this->add_responsive_control('padding',['label'=>'Innenabstand','type'=>\Elementor\Controls_Manager::DIMENSIONS,'size_units'=>['px','em'],'selectors'=>['{{WRAPPER}} .fresh-oo-status-badge'=>'padding:{{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};']]);
35
$this->add_responsive_control('radius',['label'=>'Radius','type'=>\Elementor\Controls_Manager::DIMENSIONS,'size_units'=>['px','%'],'selectors'=>['{{WRAPPER}} .fresh-oo-status-badge'=>'border-radius:{{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};']]);
36
$this->add_group_control(\Elementor\Group_Control_Border::get_type(),['name'=>'border','selector'=>'{{WRAPPER}} .fresh-oo-status-badge']);
37
$this->add_group_control(\Elementor\Group_Control_Typography::get_type(),['name'=>'typo','selector'=>'{{WRAPPER}} .fresh-oo-status-badge']);
38
$this->add_responsive_control('gap',['label'=>'Icon-Abstand','type'=>\Elementor\Controls_Manager::SLIDER,'range'=>['px'=>['min'=>0,'max'=>30]],'selectors'=>['{{WRAPPER}} .fresh-oo-status-badge'=>'gap:{{SIZE}}{{UNIT}};']]);
39
$this->add_responsive_control('icon_size',['label'=>'Icon-Größe','type'=>\Elementor\Controls_Manager::SLIDER,'range'=>['px'=>['min'=>6,'max'=>36]],'selectors'=>['{{WRAPPER}} .fresh-oo-status-badge__icon svg'=>'width:{{SIZE}}{{UNIT}};height:{{SIZE}}{{UNIT}};']]);
40
$this->end_controls_section();
41
}
42
43
private function status_value(array $s): string {
44
$source = (string)($s['source'] ?? 'auto');
45
if ($source === 'oo_status2') return trim((string)$this->meta('oo_status2'));
46
if ($source === 'oo_status') return trim((string)$this->meta('oo_status'));
47
$v = trim((string)$this->meta('oo_status2'));
48
return $v !== '' ? $v : trim((string)$this->meta('oo_status'));
49
}
50
51
private function status_group(string $raw): string {
52
$v = strtolower(remove_accents(trim($raw)));
53
$v = str_replace(['-',' '], '_', $v);
54
if (str_contains($v,'reserv')) return 'reserved';
55
if (str_contains($v,'verkauft') || str_contains($v,'vermietet') || str_contains($v,'sold') || str_contains($v,'rented') || str_contains($v,'vermarktet')) return 'sold';
56
if (str_contains($v,'akquise') || str_contains($v,'acquisition')) return 'acquisition';
57
if (str_contains($v,'aktiv') || str_contains($v,'active') || str_contains($v,'vermarktung')) return 'active';
58
return 'other';
59
}
60
61
private function status_label(string $raw): string {
62
$v = strtolower(trim($raw));
63
$map = [
64
'aktive_vermarktung'=>'Aktive Vermarktung', 'aktiv'=>'Aktiv', 'active'=>'Aktiv',
65
'in_akquise'=>'In Akquise', 'akquise'=>'In Akquise',
66
'reserviert'=>'Reserviert', 'reserved'=>'Reserviert',
67
'verkauft'=>'Verkauft', 'sold'=>'Verkauft', 'vermietet'=>'Vermietet', 'rented'=>'Vermietet',
68
];
69
if (isset($map[$v])) return $map[$v];
70
if (is_numeric($raw)) return 'Status ' . $raw;
71
return ucwords(str_replace('_',' ',trim($raw)));
72
}
73
74
protected function render(): void {
75
$s = $this->get_settings_for_display();
76
$raw = $this->status_value($s);
77
if ($raw === '') { $this->editor_empty('Kein onOffice-Status vorhanden.'); return; }
78
$label = $this->status_label($raw);
79
$prefix = trim((string)($s['prefix'] ?? ''));
80
if ($prefix !== '') $label = $prefix . ' ' . $label;
81
echo '<span class="fresh-oo-status-badge" data-status="'.esc_attr(sanitize_title($raw)).'" data-status-group="'.esc_attr($this->status_group($raw)).'">';
82
if (($s['show_icon'] ?? '') === 'yes') $this->render_selected_icon((array)($s['icon'] ?? []),'fresh-oo-status-badge__icon');
83
echo '<span class="fresh-oo-status-badge__text">'.esc_html($label).'</span></span>';
84
}
85
}
86
}
87