mirror of
https://github.com/WPMultisite/wp-multisite-dashboard.git
synced 2025-08-07 14:59:14 +08:00
初版提交
文派多站点仪表盘
This commit is contained in:
parent
9f51fc0e76
commit
0ecad06f54
135 changed files with 21593 additions and 0 deletions
308
templates/contact-info-modal.php
Normal file
308
templates/contact-info-modal.php
Normal file
|
@ -0,0 +1,308 @@
|
|||
<?php
|
||||
if (!defined('ABSPATH')) {
|
||||
exit;
|
||||
}
|
||||
|
||||
$contact_info = get_site_option('msd_contact_info', [
|
||||
'name' => get_network_option(null, 'site_name'),
|
||||
'email' => get_network_option(null, 'admin_email'),
|
||||
'phone' => '',
|
||||
'website' => network_home_url(),
|
||||
'description' => 'Network Administrator Contact Information',
|
||||
'qq' => '',
|
||||
'wechat' => '',
|
||||
'whatsapp' => '',
|
||||
'telegram' => '',
|
||||
'qr_code' => ''
|
||||
]);
|
||||
?>
|
||||
|
||||
<div id="msd-contact-info-modal" class="msd-modal" style="display: none;">
|
||||
<div class="msd-modal-content">
|
||||
<div class="msd-modal-header">
|
||||
<h3><?php _e('Edit Contact Information', 'wp-multisite-dashboard'); ?></h3>
|
||||
<button type="button" class="msd-modal-close" onclick="MSD.hideContactInfoModal()">×</button>
|
||||
</div>
|
||||
|
||||
<div class="msd-modal-body">
|
||||
<div class="msd-contact-form">
|
||||
<div class="msd-form-section">
|
||||
<div class="msd-form-field">
|
||||
<label><?php _e('Organization Name:', 'wp-multisite-dashboard'); ?></label>
|
||||
<input type="text" id="msd-contact-name" value="<?php echo esc_attr($contact_info['name']); ?>" placeholder="<?php esc_attr_e('Network Administrator', 'wp-multisite-dashboard'); ?>">
|
||||
</div>
|
||||
|
||||
<div class="msd-form-field">
|
||||
<label><?php _e('Email:', 'wp-multisite-dashboard'); ?></label>
|
||||
<input type="email" id="msd-contact-email" value="<?php echo esc_attr($contact_info['email']); ?>" placeholder="admin@example.com">
|
||||
</div>
|
||||
|
||||
<div class="msd-form-field">
|
||||
<label><?php _e('Phone:', 'wp-multisite-dashboard'); ?></label>
|
||||
<input type="text" id="msd-contact-phone" value="<?php echo esc_attr($contact_info['phone']); ?>" placeholder="+1 234 567 8900">
|
||||
</div>
|
||||
|
||||
<div class="msd-form-field">
|
||||
<label><?php _e('Website:', 'wp-multisite-dashboard'); ?></label>
|
||||
<input type="url" id="msd-contact-website" value="<?php echo esc_attr($contact_info['website']); ?>" placeholder="https://example.com">
|
||||
</div>
|
||||
|
||||
<div class="msd-form-field">
|
||||
<label><?php _e('Description:', 'wp-multisite-dashboard'); ?></label>
|
||||
<textarea id="msd-contact-description" placeholder="<?php esc_attr_e('Brief description or role', 'wp-multisite-dashboard'); ?>"><?php echo esc_textarea($contact_info['description']); ?></textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="msd-form-section">
|
||||
<div class="msd-form-grid">
|
||||
<div class="msd-form-field">
|
||||
<label>
|
||||
<span class="dashicons dashicons-admin-users"></span>
|
||||
<?php _e('QQ:', 'wp-multisite-dashboard'); ?>
|
||||
</label>
|
||||
<input type="text" id="msd-contact-qq" value="<?php echo esc_attr($contact_info['qq']); ?>" placeholder="1234567890">
|
||||
</div>
|
||||
|
||||
<div class="msd-form-field">
|
||||
<label>
|
||||
<span class="dashicons dashicons-format-chat"></span>
|
||||
<?php _e('WeChat:', 'wp-multisite-dashboard'); ?>
|
||||
</label>
|
||||
<input type="text" id="msd-contact-wechat" value="<?php echo esc_attr($contact_info['wechat']); ?>" placeholder="WeChat_ID">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="msd-form-grid">
|
||||
<div class="msd-form-field">
|
||||
<label>
|
||||
<span class="dashicons dashicons-smartphone"></span>
|
||||
<?php _e('WhatsApp:', 'wp-multisite-dashboard'); ?>
|
||||
</label>
|
||||
<input type="text" id="msd-contact-whatsapp" value="<?php echo esc_attr($contact_info['whatsapp']); ?>" placeholder="+1234567890">
|
||||
</div>
|
||||
|
||||
<div class="msd-form-field">
|
||||
<label>
|
||||
<span class="dashicons dashicons-email-alt"></span>
|
||||
<?php _e('Telegram:', 'wp-multisite-dashboard'); ?>
|
||||
</label>
|
||||
<input type="text" id="msd-contact-telegram" value="<?php echo esc_attr($contact_info['telegram']); ?>" placeholder="@username">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="msd-form-section">
|
||||
<div class="msd-form-field">
|
||||
<label><?php _e('QR Code Image URL:', 'wp-multisite-dashboard'); ?></label>
|
||||
<div class="msd-qr-input-group">
|
||||
<input type="url" id="msd-contact-qr-code" value="<?php echo esc_attr($contact_info['qr_code']); ?>" placeholder="https://example.com/qr-code.png">
|
||||
<button type="button" class="button" onclick="MSD.selectQRImage()"><?php _e('Select Image', 'wp-multisite-dashboard'); ?></button>
|
||||
</div>
|
||||
<p class="description"><?php _e('Upload or provide URL for a QR code image (WeChat, contact info, etc.)', 'wp-multisite-dashboard'); ?></p>
|
||||
|
||||
<div id="msd-qr-preview" class="msd-qr-preview" style="<?php echo empty($contact_info['qr_code']) ? 'display: none;' : ''; ?>">
|
||||
<img src="<?php echo esc_url($contact_info['qr_code']); ?>" alt="QR Code Preview" class="msd-qr-preview-img">
|
||||
<button type="button" class="msd-qr-remove" onclick="MSD.removeQRCode()">×</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="msd-modal-footer">
|
||||
<button type="button" class="button button-primary" onclick="MSD.saveContactInfo()">
|
||||
<?php _e('Save Contact Info', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
<button type="button" class="button" onclick="MSD.hideContactInfoModal()">
|
||||
<?php _e('Cancel', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.msd-modal-intro {
|
||||
margin-bottom: 24px;
|
||||
padding: 12px;
|
||||
background: #f8f9fa;
|
||||
border-radius: 4px;
|
||||
border-left: 4px solid var(--msd-primary);
|
||||
}
|
||||
|
||||
.msd-modal-intro p {
|
||||
margin: 0;
|
||||
color: var(--msd-text);
|
||||
font-size: 14px;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.msd-contact-form {
|
||||
display: grid;
|
||||
gap: 24px;
|
||||
}
|
||||
|
||||
.msd-form-section {
|
||||
padding: 16px;
|
||||
border: 1px solid var(--msd-border);
|
||||
border-radius: var(--msd-radius);
|
||||
background: var(--msd-bg-light);
|
||||
}
|
||||
|
||||
.msd-form-section h4 {
|
||||
margin: 0 0 16px 0;
|
||||
color: var(--msd-text);
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
border-bottom: 1px solid var(--msd-border);
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
|
||||
.msd-form-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.msd-form-field {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.msd-form-field:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.msd-form-field label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
margin-bottom: 6px;
|
||||
font-weight: 500;
|
||||
color: var(--msd-text);
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.msd-form-field label .dashicons {
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
color: var(--msd-primary);
|
||||
}
|
||||
|
||||
.msd-form-field input,
|
||||
.msd-form-field textarea {
|
||||
width: 100%;
|
||||
padding: 4px 8px;
|
||||
border: 1px solid var(--msd-border);
|
||||
border-radius: var(--msd-radius-small);
|
||||
font-size: 14px;
|
||||
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
||||
}
|
||||
|
||||
.msd-form-field input:focus,
|
||||
.msd-form-field textarea:focus {
|
||||
outline: none;
|
||||
border-color: var(--msd-primary);
|
||||
box-shadow: 0 0 0 2px rgba(34, 113, 177, 0.1);
|
||||
}
|
||||
|
||||
.msd-form-field textarea {
|
||||
min-height: 80px;
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
.msd-qr-input-group {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.msd-qr-input-group input {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.msd-qr-input-group .button {
|
||||
flex-shrink: 0;
|
||||
padding: 4px 16px;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.msd-qr-preview {
|
||||
margin-top: 12px;
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
border: 1px solid var(--msd-border);
|
||||
border-radius: var(--msd-radius);
|
||||
padding: 8px;
|
||||
background: white;
|
||||
}
|
||||
|
||||
.msd-qr-preview-img {
|
||||
max-width: 120px;
|
||||
max-height: 120px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.msd-qr-remove {
|
||||
position: absolute;
|
||||
top: -8px;
|
||||
right: -8px;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border-radius: 50%;
|
||||
background: var(--msd-danger);
|
||||
color: white;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
font-size: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
transition: background-color 0.2s ease;
|
||||
}
|
||||
|
||||
.msd-qr-remove:hover {
|
||||
background: #c82333;
|
||||
}
|
||||
|
||||
.msd-form-field .description {
|
||||
margin: 6px 0 0 0;
|
||||
font-size: 12px;
|
||||
color: var(--msd-text-light);
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.msd-contact-qr {
|
||||
text-align: center;
|
||||
margin-top: 16px;
|
||||
padding-top: 16px;
|
||||
border-top: 1px solid var(--msd-bg);
|
||||
}
|
||||
|
||||
.msd-qr-image {
|
||||
max-width: 100%;
|
||||
max-height: 200px;
|
||||
border: 1px solid var(--msd-border);
|
||||
padding: 12px;
|
||||
background: var(--msd-bg);
|
||||
border-radius: var(--msd-radius-small);
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 600px) {
|
||||
.msd-form-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.msd-qr-input-group {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.msd-modal-content {
|
||||
margin: 20px;
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
</style>
|
279
templates/news-sources-modal.php
Normal file
279
templates/news-sources-modal.php
Normal file
|
@ -0,0 +1,279 @@
|
|||
<?php
|
||||
if (!defined('ABSPATH')) {
|
||||
exit;
|
||||
}
|
||||
|
||||
$news_sources = get_site_option('msd_news_sources', [
|
||||
[
|
||||
'name' => 'WordPress News',
|
||||
'url' => 'https://wordpress.org/news/feed/',
|
||||
'enabled' => true
|
||||
]
|
||||
]);
|
||||
?>
|
||||
|
||||
<div id="msd-news-sources-modal" class="msd-modal" style="display: none;">
|
||||
<div class="msd-modal-content">
|
||||
<div class="msd-modal-header">
|
||||
<h3><?php _e('Configure News Sources', 'wp-multisite-dashboard'); ?></h3>
|
||||
<button type="button" class="msd-modal-close" onclick="MSD.hideNewsSourcesModal()">×</button>
|
||||
</div>
|
||||
|
||||
<div class="msd-modal-body">
|
||||
<div id="msd-news-sources-editor">
|
||||
<?php if (!empty($news_sources)): ?>
|
||||
<?php foreach ($news_sources as $index => $source): ?>
|
||||
<div class="msd-news-source-item">
|
||||
<div class="msd-source-row">
|
||||
<input type="text"
|
||||
placeholder="<?php esc_attr_e('Source Name', 'wp-multisite-dashboard'); ?>"
|
||||
value="<?php echo esc_attr($source['name']); ?>"
|
||||
class="msd-news-name"
|
||||
required>
|
||||
<input type="url"
|
||||
placeholder="<?php esc_attr_e('RSS Feed URL', 'wp-multisite-dashboard'); ?>"
|
||||
value="<?php echo esc_url($source['url']); ?>"
|
||||
class="msd-news-url"
|
||||
required>
|
||||
</div>
|
||||
|
||||
<div class="msd-source-options">
|
||||
<label class="msd-checkbox-label">
|
||||
<input type="checkbox"
|
||||
class="msd-news-enabled"
|
||||
<?php checked(!empty($source['enabled'])); ?>>
|
||||
<?php _e('Enabled', 'wp-multisite-dashboard'); ?>
|
||||
</label>
|
||||
|
||||
<button type="button" class="msd-remove-source">
|
||||
<?php _e('Remove', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<div class="msd-add-source-section">
|
||||
<button type="button" id="msd-add-news-source" class="button button-secondary">
|
||||
<span class="dashicons dashicons-plus-alt"></span>
|
||||
<?php _e('Add News Source', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="msd-modal-footer">
|
||||
<button type="button" class="button button-primary" onclick="MSD.saveNewsSources()">
|
||||
<?php _e('Save News Sources', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
<button type="button" class="button" onclick="MSD.hideNewsSourcesModal()">
|
||||
<?php _e('Cancel', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.msd-modal-intro {
|
||||
margin-bottom: 20px;
|
||||
padding: 12px;
|
||||
background: #f8f9fa;
|
||||
border-radius: 4px;
|
||||
border-left: 4px solid var(--msd-primary);
|
||||
}
|
||||
|
||||
.msd-modal-intro p {
|
||||
margin: 0;
|
||||
color: var(--msd-text);
|
||||
font-size: 14px;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.msd-news-source-item {
|
||||
margin-bottom: 16px;
|
||||
padding: 16px;
|
||||
background: var(--msd-bg);
|
||||
border: 1px solid var(--msd-border);
|
||||
border-radius: var(--msd-radius);
|
||||
transition: border-color 0.2s ease;
|
||||
}
|
||||
|
||||
.msd-news-source-item:hover {
|
||||
border-color: var(--msd-primary);
|
||||
}
|
||||
|
||||
.msd-source-row {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 2fr;
|
||||
gap: 12px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.msd-source-options {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.msd-news-name,
|
||||
.msd-news-url {
|
||||
width: 100%;
|
||||
padding: 8px 12px;
|
||||
border: 1px solid var(--msd-border);
|
||||
border-radius: var(--msd-radius-small);
|
||||
font-size: 14px;
|
||||
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
||||
}
|
||||
|
||||
.msd-news-name:focus,
|
||||
.msd-news-url:focus {
|
||||
outline: none;
|
||||
border-color: var(--msd-primary);
|
||||
box-shadow: 0 0 0 2px rgba(34, 113, 177, 0.1);
|
||||
}
|
||||
|
||||
.msd-checkbox-label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
font-size: 13px;
|
||||
color: var(--msd-text);
|
||||
cursor: pointer;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.msd-checkbox-label input[type="checkbox"] {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.msd-add-source-section {
|
||||
text-align: center;
|
||||
margin: 24px 0;
|
||||
padding: 16px;
|
||||
border: 2px dashed var(--msd-border);
|
||||
border-radius: var(--msd-radius);
|
||||
transition: border-color 0.2s ease;
|
||||
}
|
||||
|
||||
.msd-add-source-section:hover {
|
||||
border-color: var(--msd-primary);
|
||||
}
|
||||
|
||||
#msd-add-news-source {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.msd-news-help {
|
||||
margin-top: 24px;
|
||||
padding: 16px;
|
||||
background: #f8f9fa;
|
||||
border-radius: var(--msd-radius);
|
||||
border: 1px solid #e9ecef;
|
||||
}
|
||||
|
||||
.msd-news-help h4 {
|
||||
margin: 0 0 12px 0;
|
||||
color: var(--msd-text);
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.msd-news-help h5 {
|
||||
margin: 16px 0 8px 0;
|
||||
color: var(--msd-text);
|
||||
font-size: 13px;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.msd-rss-suggestions {
|
||||
display: grid;
|
||||
gap: 8px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.msd-rss-suggestion {
|
||||
display: grid;
|
||||
grid-template-columns: 120px 1fr;
|
||||
gap: 8px;
|
||||
padding: 8px;
|
||||
background: white;
|
||||
border-radius: 3px;
|
||||
font-size: 12px;
|
||||
align-items: start;
|
||||
}
|
||||
|
||||
.msd-rss-suggestion strong {
|
||||
color: var(--msd-text);
|
||||
font-size: 11px;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.msd-rss-suggestion code {
|
||||
background: #e9ecef;
|
||||
padding: 2px 4px;
|
||||
border-radius: 2px;
|
||||
font-family: 'Courier New', monospace;
|
||||
font-size: 10px;
|
||||
word-break: break-all;
|
||||
grid-column: 1 / -1;
|
||||
margin: 2px 0;
|
||||
}
|
||||
|
||||
.msd-rss-desc {
|
||||
color: var(--msd-text-light);
|
||||
font-size: 11px;
|
||||
grid-column: 1 / -1;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.msd-feed-tips {
|
||||
background: white;
|
||||
padding: 12px;
|
||||
border-radius: 3px;
|
||||
border: 1px solid #e9ecef;
|
||||
}
|
||||
|
||||
.msd-feed-tips ul {
|
||||
margin: 8px 0 0 0;
|
||||
padding-left: 16px;
|
||||
}
|
||||
|
||||
.msd-feed-tips li {
|
||||
font-size: 12px;
|
||||
color: var(--msd-text-light);
|
||||
line-height: 1.4;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 600px) {
|
||||
.msd-source-row {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.msd-source-options {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.msd-rss-suggestion {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.msd-modal-content {
|
||||
margin: 20px;
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.msd-news-source-item.error {
|
||||
border-color: var(--msd-danger);
|
||||
background: #fff5f5;
|
||||
}
|
||||
|
||||
.msd-news-url.error {
|
||||
border-color: var(--msd-danger);
|
||||
}
|
||||
</style>
|
405
templates/quick-links-modal.php
Normal file
405
templates/quick-links-modal.php
Normal file
|
@ -0,0 +1,405 @@
|
|||
<?php
|
||||
if (!defined('ABSPATH')) {
|
||||
exit;
|
||||
}
|
||||
|
||||
$quick_links = get_site_option('msd_quick_links', []);
|
||||
?>
|
||||
|
||||
<div id="msd-quick-links-modal" class="msd-modal" style="display: none;">
|
||||
<div class="msd-modal-content">
|
||||
<div class="msd-modal-header">
|
||||
<h3><?php _e('Configure Quick Links', 'wp-multisite-dashboard'); ?></h3>
|
||||
<button type="button" class="msd-modal-close" onclick="MSD.hideQuickLinksModal()">×</button>
|
||||
</div>
|
||||
|
||||
<div class="msd-modal-body">
|
||||
<div class="msd-modal-intro">
|
||||
<p><?php _e('Add custom links to frequently used pages or external tools. These will appear as clickable tiles in your Quick Links widget. You can use WordPress Dashicons or emojis for icons. Links can be reordered by dragging and dropping.', 'wp-multisite-dashboard'); ?></p>
|
||||
</div>
|
||||
|
||||
<div id="msd-quick-links-editor">
|
||||
<?php if (!empty($quick_links)): ?>
|
||||
<?php foreach ($quick_links as $index => $link): ?>
|
||||
<div class="msd-link-item">
|
||||
<div class="msd-link-row">
|
||||
<input type="text"
|
||||
placeholder="<?php esc_attr_e('Link Title', 'wp-multisite-dashboard'); ?>"
|
||||
value="<?php echo esc_attr($link['title']); ?>"
|
||||
class="msd-link-title"
|
||||
required>
|
||||
<input type="url"
|
||||
placeholder="https://example.com"
|
||||
value="<?php echo esc_url($link['url']); ?>"
|
||||
class="msd-link-url"
|
||||
required>
|
||||
</div>
|
||||
|
||||
<div class="msd-link-options">
|
||||
<input type="text"
|
||||
placeholder="<?php esc_attr_e('dashicons-admin-home or 🏠', 'wp-multisite-dashboard'); ?>"
|
||||
value="<?php echo esc_attr($link['icon']); ?>"
|
||||
class="msd-link-icon"
|
||||
title="<?php esc_attr_e('Icon (Dashicon class or emoji)', 'wp-multisite-dashboard'); ?>">
|
||||
|
||||
<label class="msd-checkbox-label">
|
||||
<input type="checkbox"
|
||||
class="msd-link-newtab"
|
||||
<?php checked(!empty($link['new_tab'])); ?>>
|
||||
<?php _e('Open in new tab', 'wp-multisite-dashboard'); ?>
|
||||
</label>
|
||||
|
||||
<button type="button" class="msd-remove-link">
|
||||
<?php _e('Remove', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<div class="msd-add-link-section">
|
||||
<button type="button" id="msd-add-link" class="button button-secondary">
|
||||
<span class="dashicons dashicons-plus-alt"></span>
|
||||
<?php _e('Add Link', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="msd-quick-links-help">
|
||||
<h4><?php _e('Icon Options', 'wp-multisite-dashboard'); ?></h4>
|
||||
|
||||
<div class="msd-icon-types">
|
||||
<div class="msd-icon-type-section">
|
||||
<h5><?php _e('WordPress Dashicons', 'wp-multisite-dashboard'); ?></h5>
|
||||
<div class="msd-icon-examples">
|
||||
<div class="msd-icon-example">
|
||||
<span class="dashicons dashicons-admin-home"></span>
|
||||
<code>dashicons-admin-home</code>
|
||||
<span><?php _e('Home/Dashboard', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="dashicons dashicons-admin-settings"></span>
|
||||
<code>dashicons-admin-settings</code>
|
||||
<span><?php _e('Settings', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="dashicons dashicons-admin-users"></span>
|
||||
<code>dashicons-admin-users</code>
|
||||
<span><?php _e('Users', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="dashicons dashicons-chart-bar"></span>
|
||||
<code>dashicons-chart-bar</code>
|
||||
<span><?php _e('Analytics', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="dashicons dashicons-email"></span>
|
||||
<code>dashicons-email</code>
|
||||
<span><?php _e('Email', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="dashicons dashicons-external"></span>
|
||||
<code>dashicons-external</code>
|
||||
<span><?php _e('External Link', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="msd-icon-type-section">
|
||||
<h5><?php _e('Emojis', 'wp-multisite-dashboard'); ?></h5>
|
||||
<div class="msd-icon-examples">
|
||||
<div class="msd-icon-example">
|
||||
<span class="msd-emoji">🏠</span>
|
||||
<code>🏠</code>
|
||||
<span><?php _e('Home', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="msd-emoji">⚙️</span>
|
||||
<code>⚙️</code>
|
||||
<span><?php _e('Settings', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="msd-emoji">👥</span>
|
||||
<code>👥</code>
|
||||
<span><?php _e('Users', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="msd-emoji">📊</span>
|
||||
<code>📊</code>
|
||||
<span><?php _e('Analytics', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="msd-emoji">📧</span>
|
||||
<code>📧</code>
|
||||
<span><?php _e('Email', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="msd-emoji">🔗</span>
|
||||
<code>🔗</code>
|
||||
<span><?php _e('Link', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="msd-reorder-tip">
|
||||
<h5><?php _e('Drag & Drop Reordering', 'wp-multisite-dashboard'); ?></h5>
|
||||
<p class="description"><?php _e('After saving your links, you can reorder them by dragging and dropping the tiles in the Quick Links widget.', 'wp-multisite-dashboard'); ?></p>
|
||||
</div>
|
||||
|
||||
<p class="description">
|
||||
<strong><?php _e('Dashicons:', 'wp-multisite-dashboard'); ?></strong> <?php _e('Built into WordPress, always available. Use format:', 'wp-multisite-dashboard'); ?> <code>dashicons-icon-name</code><br>
|
||||
<strong><?php _e('Emojis:', 'wp-multisite-dashboard'); ?></strong> <?php _e('Copy and paste emoji directly. Works on all devices.', 'wp-multisite-dashboard'); ?>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
<?php printf(__('Find more Dashicons at %s', 'wp-multisite-dashboard'), '<a href="https://developer.wordpress.org/resource/dashicons/" target="_blank">developer.wordpress.org/resource/dashicons/</a>'); ?>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="msd-modal-footer">
|
||||
<button type="button" class="button button-primary" onclick="MSD.saveQuickLinks()">
|
||||
<?php _e('Save Links', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
<button type="button" class="button" onclick="MSD.hideQuickLinksModal()">
|
||||
<?php _e('Cancel', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.msd-modal-intro {
|
||||
margin-bottom: 20px;
|
||||
padding: 12px;
|
||||
background: #f8f9fa;
|
||||
border-radius: 4px;
|
||||
border-left: 4px solid var(--msd-primary);
|
||||
}
|
||||
|
||||
.msd-modal-intro p {
|
||||
margin: 0;
|
||||
color: var(--msd-text);
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.msd-link-item {
|
||||
margin-bottom: 16px;
|
||||
padding: 16px;
|
||||
background: var(--msd-bg);
|
||||
border: 1px solid var(--msd-border);
|
||||
border-radius: var(--msd-radius);
|
||||
transition: border-color 0.2s ease;
|
||||
}
|
||||
|
||||
.msd-link-item:hover {
|
||||
border-color: var(--msd-primary);
|
||||
}
|
||||
|
||||
.msd-link-row {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 12px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.msd-link-options {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr auto auto;
|
||||
gap: 12px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.msd-link-title,
|
||||
.msd-link-url,
|
||||
.msd-link-icon {
|
||||
width: 100%;
|
||||
padding: 8px 12px;
|
||||
border: 1px solid var(--msd-border);
|
||||
border-radius: var(--msd-radius-small);
|
||||
font-size: 14px;
|
||||
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
||||
}
|
||||
|
||||
.msd-link-title:focus,
|
||||
.msd-link-url:focus,
|
||||
.msd-link-icon:focus {
|
||||
outline: none;
|
||||
border-color: var(--msd-primary);
|
||||
box-shadow: 0 0 0 2px rgba(34, 113, 177, 0.1);
|
||||
}
|
||||
|
||||
.msd-checkbox-label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
font-size: 13px;
|
||||
color: var(--msd-text);
|
||||
cursor: pointer;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.msd-checkbox-label input[type="checkbox"] {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.msd-add-link-section {
|
||||
text-align: center;
|
||||
margin: 24px 0;
|
||||
padding: 16px;
|
||||
border: 2px dashed var(--msd-border);
|
||||
border-radius: var(--msd-radius);
|
||||
transition: border-color 0.2s ease;
|
||||
}
|
||||
|
||||
.msd-add-link-section:hover {
|
||||
border-color: var(--msd-primary);
|
||||
}
|
||||
|
||||
#msd-add-link {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.msd-quick-links-help {
|
||||
margin-top: 24px;
|
||||
padding: 16px;
|
||||
background: #f8f9fa;
|
||||
border-radius: var(--msd-radius);
|
||||
border: 1px solid #e9ecef;
|
||||
}
|
||||
|
||||
.msd-quick-links-help h4 {
|
||||
margin: 0 0 16px 0;
|
||||
color: var(--msd-text);
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.msd-icon-types {
|
||||
display: grid;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.msd-icon-type-section h5 {
|
||||
margin: 0 0 12px 0;
|
||||
color: var(--msd-text);
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
padding-bottom: 6px;
|
||||
border-bottom: 1px solid #e9ecef;
|
||||
}
|
||||
|
||||
.msd-icon-examples {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
|
||||
gap: 8px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.msd-icon-example {
|
||||
display: grid;
|
||||
grid-template-columns: 24px 1fr auto;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
padding: 8px;
|
||||
background: white;
|
||||
border-radius: 3px;
|
||||
font-size: 12px;
|
||||
border: 1px solid #e9ecef;
|
||||
}
|
||||
|
||||
.msd-icon-example .dashicons {
|
||||
font-size: 16px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
color: var(--msd-primary);
|
||||
}
|
||||
|
||||
.msd-icon-example .msd-emoji {
|
||||
font-size: 16px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.msd-icon-example code {
|
||||
background: #e9ecef;
|
||||
padding: 2px 4px;
|
||||
border-radius: 2px;
|
||||
font-family: 'Courier New', monospace;
|
||||
font-size: 10px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.msd-icon-example span:last-child {
|
||||
color: var(--msd-text-light);
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.msd-reorder-tip {
|
||||
margin-top: 20px;
|
||||
padding: 12px;
|
||||
background: #e7f3ff;
|
||||
border-radius: 4px;
|
||||
border-left: 4px solid #2196f3;
|
||||
}
|
||||
|
||||
.msd-reorder-tip h5 {
|
||||
margin: 0 0 8px 0;
|
||||
color: var(--msd-text);
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.msd-quick-links-help .description {
|
||||
margin: 12px 0 0 0;
|
||||
font-size: 12px;
|
||||
color: var(--msd-text-light);
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.msd-quick-links-help .description:last-child {
|
||||
margin-top: 8px;
|
||||
padding-top: 8px;
|
||||
border-top: 1px solid #e9ecef;
|
||||
}
|
||||
|
||||
.msd-quick-links-help a {
|
||||
color: var(--msd-primary);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.msd-quick-links-help a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 600px) {
|
||||
.msd-link-row {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.msd-link-options {
|
||||
grid-template-columns: 1fr;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.msd-icon-examples {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.msd-modal-content {
|
||||
margin: 20px;
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.msd-link-item.error {
|
||||
border-color: var(--msd-danger);
|
||||
background: #fff5f5;
|
||||
}
|
||||
|
||||
.msd-link-url.error {
|
||||
border-color: var(--msd-danger);
|
||||
}
|
||||
</style>
|
367
templates/settings-page.php
Normal file
367
templates/settings-page.php
Normal file
|
@ -0,0 +1,367 @@
|
|||
<?php
|
||||
if (!defined('ABSPATH')) {
|
||||
exit;
|
||||
}
|
||||
|
||||
if (isset($_GET['updated']) && $_GET['updated'] === 'true') {
|
||||
echo '<div class="notice notice-success is-dismissible"><p>' . __('Settings saved successfully!', 'wp-multisite-dashboard') . '</p></div>';
|
||||
}
|
||||
?>
|
||||
|
||||
<div class="wrap">
|
||||
<h1><?php echo esc_html( get_admin_page_title() ); ?>
|
||||
<span style="font-size: 13px; padding-left: 10px;">
|
||||
<?php printf( esc_html__( 'Version: %s', 'wp-multisite-dashboard' ), esc_html( WP_MSD_VERSION ) ); ?>
|
||||
</span>
|
||||
<a href="https://wpmultisite.com/document/wp-multisite-dashboard" target="_blank" class="button button-secondary" style="margin-left: 10px;">
|
||||
<?php esc_html_e( 'Documentation', 'wp-multisite-dashboard' ); ?>
|
||||
</a>
|
||||
<a href="https://wpmultisite.com/support/" target="_blank" class="button button-secondary">
|
||||
<?php esc_html_e( 'Support', 'wp-multisite-dashboard' ); ?>
|
||||
</a>
|
||||
</h1>
|
||||
|
||||
<div class="msd-card">
|
||||
<h2><?php _e('Widget Configuration', 'wp-multisite-dashboard'); ?></h2>
|
||||
<p><?php _e('Enable or disable dashboard widgets according to your needs.', 'wp-multisite-dashboard'); ?></p>
|
||||
|
||||
<form method="post" action="">
|
||||
<?php wp_nonce_field('msd_settings', 'msd_settings_nonce'); ?>
|
||||
|
||||
<div class="msd-settings-grid">
|
||||
<?php foreach ($widget_options as $widget_id => $widget_name): ?>
|
||||
<div class="msd-widget-toggle">
|
||||
<label>
|
||||
<input
|
||||
type="checkbox"
|
||||
name="widgets[<?php echo esc_attr($widget_id); ?>]"
|
||||
value="1"
|
||||
<?php checked(!empty($this->enabled_widgets[$widget_id])); ?>
|
||||
/>
|
||||
<?php echo esc_html($widget_name); ?>
|
||||
</label>
|
||||
<p class="description">
|
||||
<?php echo $this->get_widget_description($widget_id); ?>
|
||||
</p>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
|
||||
<p class="submit">
|
||||
<?php submit_button(__('Save Widget Settings', 'wp-multisite-dashboard'), 'primary', 'submit', false); ?>
|
||||
</p>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="msd-card">
|
||||
<h2><?php _e('News Sources Configuration', 'wp-multisite-dashboard'); ?></h2>
|
||||
<p><?php _e('Configure custom RSS news sources for the Network News widget.', 'wp-multisite-dashboard'); ?></p>
|
||||
|
||||
<div class="msd-news-sources-config">
|
||||
<?php
|
||||
$news_sources = get_site_option('msd_news_sources', [
|
||||
[
|
||||
'name' => 'WordPress News',
|
||||
'url' => 'https://wordpress.org/news/feed/',
|
||||
'enabled' => true
|
||||
]
|
||||
]);
|
||||
?>
|
||||
|
||||
<div class="msd-current-sources">
|
||||
<h3><?php _e('Current News Sources', 'wp-multisite-dashboard'); ?></h3>
|
||||
|
||||
<?php if (!empty($news_sources)): ?>
|
||||
<table class="wp-list-table widefat striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><?php _e('Source Name', 'wp-multisite-dashboard'); ?></th>
|
||||
<th><?php _e('RSS URL', 'wp-multisite-dashboard'); ?></th>
|
||||
<th><?php _e('Status', 'wp-multisite-dashboard'); ?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($news_sources as $source): ?>
|
||||
<tr>
|
||||
<td><strong><?php echo esc_html($source['name']); ?></strong></td>
|
||||
<td>
|
||||
<a href="<?php echo esc_url($source['url']); ?>" target="_blank" class="msd-url-link">
|
||||
<?php echo esc_html($source['url']); ?>
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<?php if ($source['enabled']): ?>
|
||||
<span class="msd-status-badge msd-status-active"><?php _e('Enabled', 'wp-multisite-dashboard'); ?></span>
|
||||
<?php else: ?>
|
||||
<span class="msd-status-badge msd-status-inactive"><?php _e('Disabled', 'wp-multisite-dashboard'); ?></span>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php else: ?>
|
||||
<div class="msd-empty-state">
|
||||
<p><?php _e('No news sources configured.', 'wp-multisite-dashboard'); ?></p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<div class="msd-news-actions">
|
||||
<button type="button" class="button button-primary" onclick="MSD.showNewsSourcesModal()">
|
||||
<span class="dashicons dashicons-rss"></span>
|
||||
<?php _e('Manage News Sources', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
|
||||
<button type="button" class="button button-secondary" onclick="MSD.clearNewsCache()">
|
||||
↻
|
||||
<?php _e('Clear News Cache', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="msd-news-help">
|
||||
<h4><?php _e('Popular RSS Sources', 'wp-multisite-dashboard'); ?></h4>
|
||||
<div class="msd-rss-examples">
|
||||
<div class="msd-rss-example">
|
||||
<strong>WordPress News:</strong>
|
||||
<code>https://wordpress.org/news/feed/</code>
|
||||
</div>
|
||||
<div class="msd-rss-example">
|
||||
<strong>WP Tavern:</strong>
|
||||
<code>https://wptavern.com/feed</code>
|
||||
</div>
|
||||
</div>
|
||||
<p class="description">
|
||||
<?php _e('You can add any valid RSS or Atom feed URL. The news widget will fetch and display the latest articles from your configured sources.', 'wp-multisite-dashboard'); ?>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="msd-card">
|
||||
<h2><?php _e('Cache Management', 'wp-multisite-dashboard'); ?></h2>
|
||||
<p><?php _e('Clear cached data to refresh dashboard widgets.', 'wp-multisite-dashboard'); ?></p>
|
||||
|
||||
<div class="msd-cache-actions">
|
||||
<button type="button" class="button" onclick="MSD.clearCache('all')">
|
||||
↻
|
||||
<?php _e('Clear All Caches', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
<button type="button" class="button" onclick="MSD.clearCache('network')">
|
||||
<span class="dashicons dashicons-admin-multisite"></span>
|
||||
<?php _e('Clear Network Data', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<p class="description">
|
||||
<?php _e('Clearing caches will force the dashboard widgets to reload fresh data on the next page visit.', 'wp-multisite-dashboard'); ?>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.msd-status-badge {
|
||||
display: inline-block;
|
||||
padding: 2px 8px;
|
||||
border-radius: 3px;
|
||||
font-size: 11px;
|
||||
font-weight: 400;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.msd-status-active {
|
||||
background: #d1eddb;
|
||||
color: #155724;
|
||||
}
|
||||
|
||||
.msd-status-inactive {
|
||||
background: #f8d7da;
|
||||
color: #721c24;
|
||||
}
|
||||
|
||||
.msd-cache-actions,
|
||||
.msd-news-actions {
|
||||
display: flex;
|
||||
gap: 12px;
|
||||
margin: 16px 0;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.msd-cache-actions .button,
|
||||
.msd-news-actions .button {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.msd-news-sources-config {
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
.msd-current-sources h3 {
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.msd-url-link {
|
||||
word-break: break-all;
|
||||
color: var(--msd-primary);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.msd-url-link:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.msd-news-help {
|
||||
margin-top: 24px;
|
||||
padding: 16px;
|
||||
background: #f8f9fa;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.msd-news-help h4 {
|
||||
margin: 0 0 12px 0;
|
||||
color: var(--msd-text);
|
||||
}
|
||||
|
||||
.msd-rss-examples {
|
||||
display: grid;
|
||||
gap: 8px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.msd-rss-example {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 8px;
|
||||
background: white;
|
||||
border-radius: 3px;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.msd-rss-example strong {
|
||||
color: var(--msd-text);
|
||||
}
|
||||
|
||||
.msd-rss-example code {
|
||||
background: #e9ecef;
|
||||
padding: 2px 6px;
|
||||
border-radius: 2px;
|
||||
font-family: 'Courier New', monospace;
|
||||
font-size: 11px;
|
||||
color: var(--msd-text-light);
|
||||
}
|
||||
|
||||
@media screen and (max-width: 768px) {
|
||||
.msd-cache-actions,
|
||||
.msd-news-actions {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.msd-rss-example {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: 4px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
window.MSD = window.MSD || {};
|
||||
|
||||
MSD.clearCache = function(type) {
|
||||
if (!confirm('<?php echo esc_js(__('Are you sure you want to clear the cache?', 'wp-multisite-dashboard')); ?>')) {
|
||||
return;
|
||||
}
|
||||
|
||||
var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>';
|
||||
|
||||
jQuery.post(ajaxurl, {
|
||||
action: 'msd_clear_cache',
|
||||
cache_type: type,
|
||||
nonce: '<?php echo wp_create_nonce('msd_clear_cache'); ?>'
|
||||
}, function(response) {
|
||||
if (response.success) {
|
||||
alert('<?php echo esc_js(__('Cache cleared successfully!', 'wp-multisite-dashboard')); ?>');
|
||||
} else {
|
||||
alert('<?php echo esc_js(__('Failed to clear cache.', 'wp-multisite-dashboard')); ?>');
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
MSD.clearNewsCache = function() {
|
||||
if (!confirm('<?php echo esc_js(__('Are you sure you want to clear the news cache?', 'wp-multisite-dashboard')); ?>')) {
|
||||
return;
|
||||
}
|
||||
|
||||
var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>';
|
||||
|
||||
jQuery.post(ajaxurl, {
|
||||
action: 'msd_refresh_widget_data',
|
||||
widget: 'custom_news',
|
||||
nonce: '<?php echo wp_create_nonce('msd_ajax_nonce'); ?>'
|
||||
}, function(response) {
|
||||
if (response.success) {
|
||||
alert('<?php echo esc_js(__('News cache cleared successfully!', 'wp-multisite-dashboard')); ?>');
|
||||
} else {
|
||||
alert('<?php echo esc_js(__('Failed to clear news cache.', 'wp-multisite-dashboard')); ?>');
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
MSD.showNewsSourcesModal = function() {
|
||||
if (typeof jQuery !== 'undefined' && jQuery('#msd-news-sources-modal').length) {
|
||||
jQuery('#msd-news-sources-modal').fadeIn(200);
|
||||
jQuery('body').addClass('modal-open');
|
||||
} else {
|
||||
alert('<?php echo esc_js(__('Please go to the dashboard to configure news sources.', 'wp-multisite-dashboard')); ?>');
|
||||
}
|
||||
};
|
||||
|
||||
MSD.hideNewsSourcesModal = function() {
|
||||
if (typeof jQuery !== 'undefined') {
|
||||
jQuery('#msd-news-sources-modal').fadeOut(200);
|
||||
jQuery('body').removeClass('modal-open');
|
||||
}
|
||||
};
|
||||
|
||||
MSD.saveNewsSources = function() {
|
||||
if (typeof jQuery === 'undefined') {
|
||||
alert('jQuery is required for this functionality');
|
||||
return;
|
||||
}
|
||||
|
||||
var sources = [];
|
||||
jQuery('.msd-news-source-item').each(function() {
|
||||
var $item = jQuery(this);
|
||||
var name = $item.find('.msd-news-name').val().trim();
|
||||
var url = $item.find('.msd-news-url').val().trim();
|
||||
var enabled = $item.find('.msd-news-enabled').is(':checked');
|
||||
|
||||
if (name && url) {
|
||||
sources.push({
|
||||
name: name,
|
||||
url: url,
|
||||
enabled: enabled
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>';
|
||||
|
||||
jQuery.post(ajaxurl, {
|
||||
action: 'msd_save_news_sources',
|
||||
sources: sources,
|
||||
nonce: '<?php echo wp_create_nonce('msd_ajax_nonce'); ?>'
|
||||
}, function(response) {
|
||||
if (response.success) {
|
||||
alert('<?php echo esc_js(__('News sources saved successfully!', 'wp-multisite-dashboard')); ?>');
|
||||
MSD.hideNewsSourcesModal();
|
||||
location.reload();
|
||||
} else {
|
||||
alert('<?php echo esc_js(__('Failed to save news sources.', 'wp-multisite-dashboard')); ?>');
|
||||
}
|
||||
});
|
||||
};
|
||||
</script>
|
Loading…
Add table
Add a link
Reference in a new issue